2015-06-01 72 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