2016-11-28 59 views
0

我需要從C#中的XML文件中刪除所有特定的節點。 爲了做到這一點,我選擇使用XPath查詢所有節點和嘗試下面的代碼:如何從C#中的XML文檔中刪除所有特定的節點?

XmlNodeList nodeList = xml.SelectNodes("//Test"); 
foreach (XmlNode node in nodeList) 
{ 
    node.ParentNode.RemoveChild(node); 
} 

QA數據顯示,目前仍然存在於XML文件<Test>節點上面的代碼執行後。

我做錯了什麼?我應該如何從XML文檔中刪除所有指定的節點?

回答

0

我上面貼的代碼說明了很多工程師的常見錯誤。我發現這個代碼在foreach的嚴重企業後端。

我們應該記住:

foreach語句被用於通過收集迭代得到 您想要的信息,但不能用於從源集合添加或刪除 項目避免不可預知的副作用。 如果您需要添加或刪除源集合中的項目,請使用 for循環。 Read more about foreach on MSDN

所以這段代碼的正確版本:

for (int i = 0; i < nodeList.Count; i++) 
{ 
    nodeList[i].ParentNode.RemoveChild(nodeList[i]); 
} 
+2

的警告適用於不斷變化的集合被迭代,這在你的問題'foreach'循環從來不會。看起來您可能誤解了您的問題的實際原因。也許你沒有將更新的XML保存迴文件? (單獨調用'RemoveChild'不會將更改持久化到磁盤上。) – kjhughes

+0

@kjhughes爲什麼確定'RemoveChild'不會改變集合?爲什麼相同的代碼與'for'正確工作? – DaddyM

+0

'node.ParentNode.RemoveChild(node)'從其父節點中移除'node';它沒有「節點」的概念在XPath查詢的結果中。 – kjhughes

相關問題