tags:

views:

3681

answers:

3

I need to remove an XmlNode based on a condition. How to do it?

foreach (XmlNode drawNode in nodeList)
{
       //Based on a condition
       drawNode.RemoveAll();  //need to remove the entire node                      

}
+3  A: 

You can not easily use iterators (foreach-statement) to delete your nodes. As I see it you can do the following:

1) In your foreach-loop, save a list of all elements that should be removed. Then you loop through just those elements and remove them.

2) Use an ordinary for-loop and keep track of which is the next element to visit after you have deleted one item.

Edit: When using a for-loop do it the way Fredrik suggests, looping backwards.

Daniel Persson
Upvoting for the first answer; part 2 sounds a bit complicated the way you describe it, it's usually easier to iterate over the list in reverse order so you don't have to worry about the next index.
overslacked
Why I added "..keep track of which is the next element to visit..." was because I didn't know in which way the for-loop would be implemented, if the nodes are in correct order etc.
Daniel Persson
+4  A: 

If you're trying to remove a node from the XML DOM, this isn't the correct way. Because an XMLNodeList is just a list of nodes. Rather you want to remove the node from the parent node. Like this:

XmlNode parentNode = // some value
XmlNode drawNode = // some value
parentNode.RemoveNode(drawNode);
Keltex
+9  A: 

This should do the trick for you:

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

If you loop using a regular for-loop, and loop over it "backwards" you can remove items as you go.

Update: here is a full example, including loading an xml file, locating nodes, deleting them and saving the file:

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);
Fredrik Mörk
Shouldn't it work when looped forward also??
iJeeves
In this particular case it would work since the code is not removing the nodes from the XmlNodeList collection, but from the XmlDocument DOM, but in many other cases deleting items in a forward for-loop may give unexpected results (such as items not being removed). Reflex movement, I guess ;o)
Fredrik Mörk
This is the widely used iterative method to remove item from collections.thanks fredrik for the code wise enlightenment to all:)
Ravisha