没有为嵌套元素生成 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.

因此,数据结构被序列化 ,没有 在嵌套的 firstNamelastName 元素上重复 xmlns="http://tempuri.org/" 属性,因为它们是多余的. id 和每个 Student 元素都有自己的 xmlns 属性的原因是它们是兄弟姐妹,形成不相交的命名空间声明范围。

换句话说,您的代码生成的 XML 是正确的,符合预期。如果嵌套元素上有额外的 xmlns 属性,它就没有语义效果。我会更担心这样一个事实,即您没有序列化特定的根 class,而是序列化普通的 Departement[](除非它仅用于调试/试验目的)。