创建 XML 文档时的默认命名空间

3

是否可以使用XmlDocument.CreateElement()和XmlNode.AppendChild()创建子元素而不指定命名空间并使用“默认”命名空间?

目前,如果我创建一个带有命名空间的根节点,并且不在每个子节点上指定命名空间,则输出的xml将定义一个空白命名空间。

如果我不为每个创建的元素指定命名空间,则生成以下内容。是否有一种快捷方式,我不必每次都指定命名空间?

<root xmlns="http://example.com">
  <child1 xmlns="">
    <child2 />
  </child1>
</root>

代码:

XmlDocument doc = new XmlDocument();
var rootNode = doc.CreateElement("root", "http://example.com");
doc.AppendChild(rootNode);
var child1Node = doc.CreateElement("child1");
rootNode.AppendChild(child1Node);
var child2Node = doc.CreateElement("child2");
child1Node.AppendChild(child2Node);
2个回答

8
如果您已经创建了XML文档,并且在层次结构中为每个元素指定了相同的命名空间,类似于以下内容:
        XmlDocument doc = new XmlDocument();

        const string xmlNS = "http://www.example.com";

        XmlElement root = doc.CreateElement("root", xmlNS);
        doc.AppendChild(root);

        XmlElement child1 = doc.CreateElement("child1", xmlNS);
        root.AppendChild(child1);

        child1.AppendChild(doc.CreateElement("child2", xmlNS));

        doc.Save(@"D:\test.xml");

然后您将获得此输出文件:
<root xmlns="http://www.example.com">
  <child1>
    <child2 />
  </child1>
</root>
< p >在层次结构中,< code ><root>节点上的命名空间会被继承下来,除非子元素明确定义了其他内容。 < p >如果您使用 < code >doc.CreateElement 创建一个新的XmlElement,并且没有指定XML命名空间,那么这个新元素将具有空命名空间,因此它将被序列化到您所拥有的XML文档中。 < p >我不知道是否有任何方法可以指定创建新元素时要使用的默认命名空间 - 如果指定了一个命名空间,则该元素将使用该命名空间 - 如果没有指定,则为默认命名空间。

2
如果您正在使用.NET 3.5,我建议使用LINQ to XML(System.Xml.Linq)。使用XDocument、XElement和XAttribute类。
但是marc_s的回答是正确的,命名空间是继承的。

1
嗯,marc_s的回答并没有说命名空间是继承的。它说你必须为你创建的每个XML元素手动指定它。 - Jez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接