2010-06-14 67 views
3

是否可以使用XmlDocument.CreateElement()和XmlNode.AppendChild()创建子类而不指定名称空间并让它使用“默认”名称空间?创建xml文档时的默认名称空间

目前,如果我使用命名空间创建根节点,并且不在每个子节点上指定命名空间,则输出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); 

回答

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> 

<root>节点上的名称空间沿层次结构继承,除非子元素明确定义其他内容。

如果您使用doc.CreateElement创建新的XmlElement,并且未指定XML名称空间,那么当然,该新元素将具有空白名称空间,因此这将被序列化到您拥有的XML文档中。

我不知道有什么方法可以指定一个默认命名空间,以便在您创建新元素时使用 - 如果您指定了一个元素,那么该元素将使用该命名空间 - 如果您没有指定它,则是空白命名空间。

2

如果您使用的是.NET 3.5,我建议使用LINQ to XML(System.Xml.Linq)。使用XDocument,XElement和XAttribute类。

但marc_s的回答是正确的,命名空间是继承的。

+1

呃,marc_s的回答并没有说这个名字空间是继承的。它说你必须为你创建的每个XML元素手动指定它。 – Jez 2015-02-12 10:39:07

相关问题