如何从XmlNodeList中删除XmlNode

我需要根据条件删除XmlNode。 怎么做?

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

这应该是你的诀窍:

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

您无法轻松使用迭代器(foreach语句)来删除节点。 在我看来,你可以做到以下几点:

1)在foreach循环中,保存应删除的所有元素的列表。 然后,您只需遍历这些元素并将其删除。

2)使用普通的for循环,并在删除一个项目后跟踪哪个是要访问的下一个元素。

编辑:当使用for循环时,按照Fredrik建议的方式进行,循环向后循环。

如果您尝试从XML DOM中删除节点,则这不是正确的方法。 因为XMLNodeList只是一个节点列表。 而是要从父节点中删除节点。 像这样:

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

以下不是更简单一点:

 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); 
  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();