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
}
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
}
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.
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);
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);