C#,XML:将第二个名称空间移动到根元素

时间:2015-03-03 15:33:49

标签: c# xml xsd xml-namespaces

我正在尝试使用System.XML.XmlDocument类创建XML文档。

我的文档中有两个名称空间。

我的C#代码是什么样的:

XmlDocument xDoc = new XmlDocument();
xDoc.InsertBefore(xDoc.CreateXmlDeclaration("1.0","UTF-8","yes"),xDoc.DocumentElement);
XmlElement root = xDoc.CreateElement('ROOT','http://example.org/ns1');
xDoc.AppendChild(root);
XmlElement child1 = xDoc.CreateElement('CHILD1','http://example.org/ns1');
root.AppendChild(child1);
XmlElement child2 = xDoc.CreateElement('ns2:CHILD2','http://example.com/ns2');
root.AppendChild(child2);
XmlElement child3 = xDoc.CreateElement('ns2:CHILD3','http://example.com/ns2');
root.AppendChild(child3);

期望的输出:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<ROOT xmlns="http://example.org/ns1" xmlns:ns2="http://example.com/ns2">
    <CHILD1/>
    <ns2:CHILD2/>
    <ns2:CHILD3/>
</ROOT>

实际输出:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<ROOT xmlns="http://example.org/ns1">
    <CHILD1/>
    <ns2:CHILD2 xmlns:ns2="http://example.com/ns2"/>
    <ns2:CHILD3 xmlns:ns2="http://example.com/ns2"/>
</ROOT>

因为第二个命名空间的元素在我的文档中多次出现,所以我不想要第二个命名空间的这种重复声明,而是只在根元素中只有一次。

我怎样才能做到这一点?

使用LINQ2XML不是我的选择。

1 个答案:

答案 0 :(得分:1)

只需将所有所需的名称空间作为属性添加到根元素,例如

root.SetAttribute("xmlns:ns2", "http://example.com/ns2");

在最后添加这一行将产生几乎所需的输出(唯一的区别是xmlns属性的顺序,但我认为在你的情况下并不重要):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ROOT xmlns:ns2="http://example.com/ns2" xmlns="http://example.org/ns1">
    <CHILD1 />
    <ns2:CHILD2 />
    <ns2:CHILD3 />
</ROOT>