2015-06-01 44 views
2

我在C#中创建xml,并且想要添加命名空间和声明。下面我的XML:如何在XDocument中添加命名空间和声明

XNamespace ns = "http://ab.com//abc"; 

XDocument myXML = new XDocument(
    new XDeclaration("1.0","utf-8","yes"), 
    new XElement(ns + "Root", 
     new XElement("abc","1"))) 

这将在两个根级别和子元素ABC水平,以及补充xmlns=""

<Root xmlns="http://ab.com/ab"> 
    <abc xmlns=""></abc> 
</Root> 

但我想它在仅根级别没有孩子的水平象下面这样:

<Root xmlns="http://ab.com/ab"> 
    <abc></abc> 
</Root> 

,以及如何在顶部添加声明,我的代码没有显示运行后声明。

请帮我获得完整的XML作为

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<Root xmlns="http://ab.com/ab"> 
    <abc></abc> 
</Root> 

回答

0

您需要使用相同的命名空间中的子元素:

XDocument myXML = new XDocument(
    new XDeclaration("1.0","utf-8","yes"), 
     new XElement(ns + "Root", 
      new XElement(ns + "abc", "1"))) 

如果只是用​​这会被转化成没有命名空间的XName。这会导致添加一个xmlns=""属性,因此abc的完全限定元素名称将如此解析。当作为http://ab.com/ab默认名称空间是从Root继承转换成字符串

通过名称没有xmlns属性设置为ns + "abc"将被添加。

如果你想简单地'继承'命名空间,那么你将无法以这种流畅的方式做到这一点。你必须使用父元素的命名空间,例如创建XName

var root = new XElement(ns + "Root"); 
root.Add(new XElement(root.Name.Namespace + "abc", "1")); 

关于声明,呼吁ToStringXDocument不包括此。如果您使用Save写入Stream,TextWriter,或者您提供的XmlWriterXmlWriterSettings中没有OmitXmlDeclaration = true

如果您只想得到字符串,this question有一个使用StringWriter的漂亮扩展方法的答案。

+0

感谢您的回答。如果我不想在子元素中引用命名空间,那么如何实现? – user1893874

+0

@ user1893874有没有简单的方法,我已经添加了一个可能的选项。你如何应用这取决于你的代码的更广泛的上下文。 –

0

使用您创建的所有元素的命名空间:

XDocument myXML = new XDocument(
        new XDeclaration("1.0","utf-8","yes"), 
        new XElement(ns + "Root", 
        new XElement(ns + "abc","1"))) 
+0

感谢您的答案。不能我只将名称空间添加到根元素? – user1893874