Xml序列化:无法在父元素和子元素中定义相同的命名空间

时间:2014-04-07 18:30:17

标签: c# .net xml serialization

我需要创建一个类似于此的xml结构:

<?xml version="1.0" encoding="utf-8"?>
<ns0:RootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns0="http://fuu.gub">
  <ns0:ChildElement xmlns:ns0="http://fuu.gub">
    <ns0:Data>Some-data</ns0:Data>
  </ns0:ChildElement>
</ns0:RootElement>

必须在RootElement和ChildElement中定义名称空间ns0。 我使用Xml.Serialization来序列化我的对象,但我无法完成这项工作。 序列化程序忽略了子元素上的命名空间,因为它已在父元素中定义。这意味着我最终得到以下结果:

<?xml version="1.0" encoding="utf-8"?>
<ns0:RootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns0="http://fuu.gub">
  <ns0:ChildElement>
    <ns0:Data>Some-data</ns0:Data>
  </ns0:ChildElement>
</ns0:RootElement>

这是我的代码

[XmlRoot("RootElement", Namespace = "http://fuu.gub")]
public class RootElement
{
    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces XmlNamespaces { get; set; }

    [XmlElement("ChildElement")]
    public ChildElement Child { get; set; }

    public RootElement() {
        XmlNamespaces = new XmlSerializerNamespaces();
        XmlNamespaces.Add("ns0", "http://fuu.gub");

        Child = new ChildElement();
    }

    public void ToXml(string path)
    {
        XmlSerializer x = new System.Xml.Serialization.XmlSerializer(this.GetType());

        TextWriter txtW = new StreamWriter(path);
        x.Serialize(txtW, this);
    }
}


[XmlRoot(Namespace = "http://fuu.gub")]
public class ChildElement
{
    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces XmlNamespaces { get; set; }

    [XmlElement]
    public string Data{ get; set; }

    public ChildElement()
    {
        XmlNamespaces = new XmlSerializerNamespaces();
        XmlNamespaces.Add("ns0", "http://fuu.gub");

        Data = "Some-data";
    }
}

1 个答案:

答案 0 :(得分:1)

这里http://www.w3schools.com/xml/xml_namespaces.asp我发现了这个:

  

为元素定义名称空间时,所有子元素都使用   相同的前缀与同一名称空间相关联。

     

命名空间可以在使用它们的元素中声明   XML根元素

     

注意:解析器不使用命名空间URI来查找   信息。

定义命名空间时,不能使用相同的前缀再次定义另一个/相同的命名空间。

我相信您可以使用具有不同前缀的相同名称空间。