2012-02-12 101 views
0

當我運行下面的代碼來添加一個具有屬性的元素時,它總是在最後添加xlmns =「」。我讀過,我需要爲它的父級或類似的東西設置命名空間。奇怪的是,在文件父項確實已經命名空間已經設置,所以我不知道爲什麼這不會被加載文檔時已經被解釋。但無論哪種方式,我只想知道如何告訴它命名空間在那裏,因此它將停止將xlmns =「」添加到所有內容的末尾。如何通過設置項目命名空間來擺脫xmlns =「」

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load(projectFile); 

// ... 
// ... 

var n = xDoc.CreateNode(XmlNodeType.Element, "Compile", null); 
var a = xDoc.CreateAttribute("Include"); 
a.Value = filePath; 
n.Attributes.Append(a); 
itemGroupNode.AppendChild(n); 
xDoc.Save(@"c:\projects\BusinessObjects\BusinessObjects.csproj"); 
+0

你不使用[LINQ到XML的任何原因(HTTP:/ /msdn.microsoft.com/en-us/library/bb387098.aspx)? – dtb 2012-02-12 06:00:19

+0

@dtb我不用xml很多工作(至少,除了序列化之外,我實際上並不需要自己搞砸xml)。這是我需要快速完成的一個非常小的工具,所以我只是以最快的方式做到這一點。如果我發現自己需要做更多的XML,但我相信我會使用它。 – 2012-02-12 06:04:13

+1

與XTocument/XElement類的LINQ to XML相比,舊的XmlDocument/XmlElement類是一個很難處理的問題。嘗試一下! :-) – dtb 2012-02-12 06:05:41

回答

3

您要添加到命名空間的""一個元素的元素命名空間"http://schemas.microsoft.com/developer/msbuild/2003"。這意味着新元素需要xmlns屬性。

如果命名空間"http://schemas.microsoft.com/developer/msbuild/2003"添加元素,不需要xmlns屬性(因爲它是從父元素繼承):

var n = xDoc.CreateNode(XmlNodeType.Element, "Compile", 
      "http://schemas.microsoft.com/developer/msbuild/2003"); 
+0

很酷,工作。有沒有辦法告訴它查看該信息的父節點? – 2012-02-12 06:00:37

+1

假設* itemGroupNode *是一個[XmlElement](http://msdn.microsoft.com/en-us/library/system.xml.xmlelement.aspx),您可以使用* itemGroupNode。[NamespaceURI](http:// msdn.microsoft.com/en-us/library/system.xml.xmlelement.namespaceuri.aspx)*來獲取命名空間,而不是對它進行硬編碼。 – dtb 2012-02-12 06:02:32

+0

完美,謝謝! – 2012-02-12 06:07:18