没有为嵌套元素生成 xmlns 属性
xmlns attribute not produced for nested elements
我有一个 class 和另一个 class 的嵌套列表,如下所示:
public class Departement {
[XmlElement (Namespace = "http://tempuri.org/")]
string Id;
[XmlElement (Namespace = "http://tempuri.org/")]
List<Student> listStident = new List<Student> ();
}
public class Student
{
[XmlElement (Namespace = "http://tempuri.org/")]
string firstName;
[XmlElement (Namespace = "http://tempuri.org/")]
string lastName;
}
当我尝试序列化一个 Departement
数组时,我得到一个 xml 这样的:
<ArrayOfDepartement xmlns="http://www.w3...">
<Departement>
<id xmlns== "http://tempuri.org/">1234567890</id>
<Student xmlns== "http://tempuri.org/">
<firstName>med</firstName>
<lastName>ali</lastName>
</Student>
<Student xmlns== "http://tempuri.org/">
<firstName>joe</firstName>
<lastName>doe</lastName>
</Student>
</Departement>
</ArrayOfDepartement>
没有为嵌套元素生成名称空间属性。我用来序列化的代码是:
public void Serialize(object oToSerialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(oToSerialize.GetType());
XmlDocument xDoc = new XmlDocument();
using (var stream = new MemoryStream())
{
xmlSerializer.Serialize(stream, oToSerialize);
stream.Flush();
stream.Seek(0, SeekOrigin.Begin);
xDoc.Load(stream);
}
}
XML 命名空间规范 in section 6.1 指出:
The scope of a namespace declaration declaring a prefix extends from the beginning of the start-tag in which it appears to the end of the corresponding end-tag, excluding the scope of any inner declarations with the same NSAttName part. In the case of an empty tag, the scope is the tag itself.
Such a namespace declaration applies to all element and attribute names within its scope whose prefix matches that specified in the declaration.
因此,数据结构被序列化 ,没有 在嵌套的 firstName
和 lastName
元素上重复 xmlns="http://tempuri.org/"
属性,因为它们是多余的. id
和每个 Student
元素都有自己的 xmlns
属性的原因是它们是兄弟姐妹,形成不相交的命名空间声明范围。
换句话说,您的代码生成的 XML 是正确的,符合预期。如果嵌套元素上有额外的 xmlns
属性,它就没有语义效果。我会更担心这样一个事实,即您没有序列化特定的根 class,而是序列化普通的 Departement[]
(除非它仅用于调试/试验目的)。
我有一个 class 和另一个 class 的嵌套列表,如下所示:
public class Departement {
[XmlElement (Namespace = "http://tempuri.org/")]
string Id;
[XmlElement (Namespace = "http://tempuri.org/")]
List<Student> listStident = new List<Student> ();
}
public class Student
{
[XmlElement (Namespace = "http://tempuri.org/")]
string firstName;
[XmlElement (Namespace = "http://tempuri.org/")]
string lastName;
}
当我尝试序列化一个 Departement
数组时,我得到一个 xml 这样的:
<ArrayOfDepartement xmlns="http://www.w3...">
<Departement>
<id xmlns== "http://tempuri.org/">1234567890</id>
<Student xmlns== "http://tempuri.org/">
<firstName>med</firstName>
<lastName>ali</lastName>
</Student>
<Student xmlns== "http://tempuri.org/">
<firstName>joe</firstName>
<lastName>doe</lastName>
</Student>
</Departement>
</ArrayOfDepartement>
没有为嵌套元素生成名称空间属性。我用来序列化的代码是:
public void Serialize(object oToSerialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(oToSerialize.GetType());
XmlDocument xDoc = new XmlDocument();
using (var stream = new MemoryStream())
{
xmlSerializer.Serialize(stream, oToSerialize);
stream.Flush();
stream.Seek(0, SeekOrigin.Begin);
xDoc.Load(stream);
}
}
XML 命名空间规范 in section 6.1 指出:
The scope of a namespace declaration declaring a prefix extends from the beginning of the start-tag in which it appears to the end of the corresponding end-tag, excluding the scope of any inner declarations with the same NSAttName part. In the case of an empty tag, the scope is the tag itself.
Such a namespace declaration applies to all element and attribute names within its scope whose prefix matches that specified in the declaration.
因此,数据结构被序列化 ,没有 在嵌套的 firstName
和 lastName
元素上重复 xmlns="http://tempuri.org/"
属性,因为它们是多余的. id
和每个 Student
元素都有自己的 xmlns
属性的原因是它们是兄弟姐妹,形成不相交的命名空间声明范围。
换句话说,您的代码生成的 XML 是正确的,符合预期。如果嵌套元素上有额外的 xmlns
属性,它就没有语义效果。我会更担心这样一个事实,即您没有序列化特定的根 class,而是序列化普通的 Departement[]
(除非它仅用于调试/试验目的)。