2009-05-17 38 views

答えて

4

イテレータ(foreach-statement)を使用してノードを簡単に削除することはできません。 私は次のことを行うことができます:

1)foreach-loopで、削除する必要があるすべての要素のリストを保存します。次に、これらの要素だけをループして削除します。

2)通常のfor-loopを使用して、1つのアイテムを削除した後で次にアクセスする要素を追跡します。

編集:forループを使用するときは、Fredrikが示唆するように、後方にループします。

+1

最初の回答のアップ・アップ。パート2は、それを記述する方法が少し複雑に聞こえますが、逆順でリストを反復する方が簡単なので、次のインデックスについて心配する必要はありません。 – overslacked

+0

ノードが正しい順序であればforループがどのように実装されるのか分からなかったので、「..keepトラックは次の要素です...」という理由が追加されました。 –

4

XML DOMからノードを削除しようとしている場合、これは正しい方法ではありません。 XMLNodeListは単なるノードのリストです。親ノードからノードを削除します。このように:

XmlNode parentNode = // some value 
XmlNode drawNode = // some value 
parentNode.ParentNode.RemoveChild(drawNode); 
+1

AFIK 、XmlNode "RemoveNode"はC#では存在しません。 –

+1

実際、少なくとも4.0で。私は彼が意味だと思う: drawNode.ParentNode.RemoveChild(drawNode); これはちょっと醜いですが、私は "削除"機能を期待しています:drawNodeとその中の何かを押します。 – philw

+0

@philw - 私はあなたが正しいと信じています。私はそれに応じて回答を編集しました –

57

これはあなたのためにトリックを行う必要があります。

for (int i = nodeList.Count - 1; i >= 0; i--) 
{ 
    nodeList[i].ParentNode.RemoveChild(nodeList[i]); 
} 

あなたであればループを通常のforループ、ループを使用して、あなたが行くように、それは「後方」あなたがアイテムを削除することができます上。

アップデート:ここではそれらを削除し、ファイルを保存し、ノードを見つけ、xmlファイルを読み込むなど、完全な例です:

XmlDocument doc = new XmlDocument(); 
doc.Load(fileName); 
XmlNodeList nodes = doc.SelectNodes("some-xpath-query"); 
for (int i = nodes.Count - 1; i >= 0; i--) 
{ 
    nodes[i].ParentNode.RemoveChild(nodes[i]); 
} 
doc.Save(fileName); 
+0

前方にループしたときにも動作しませんか? – devnull

+1

この特定のケースでは、コードがXmlNodeListコレクションからノードを削除するのではなく、XmlDocument DOMからノードを削除しないために機能しますが、for-loopで項目を削除すると予期しない結果が発生することがあります除去された)。 Reflex Movement、o) –

+0

これは、collections.thanks fredrikのコード賢明な啓発のためにcollections.thanksのアイテムをすべて削除するために広く使われている反復メソッドです。 – Ravisha

1

は、次の少し単純ではありません。

XmlDocument doc = new XmlDocument(); 
doc.Load(fileName); 
XmlNodeList nodes = doc.SelectNodes("some-xpath-query"); 
while (nodes.FirstChild != null) {  
    nodes.RemoveChild(nodes.FirstChild); 
} 
doc.Save(fileName); 
0
XmlNodeList xnodeContact = xmldocContact.GetElementsByTagName("contact"); 
      foreach (ListViewItem item in listViewContacts.Items) 
      { 
       if (item.Checked) 
       { 
        if (item.Index >= 0) 
         xnodeContact[0].ParentNode.RemoveChild(xnodeContact[0]); 
         listViewContacts.Items.Remove(item); 
        } 
       } 
      } 
      xmldocContact.Save(appdataPath + "\\WhatAppcontactList.xml"); 
      Invalidate(); 
関連する問題