2016-11-28 32 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

関連する問題