我需要根据条件删除XmlNode。怎么做?
foreach (XmlNode drawNode in nodeList)
{
//Based on a condition
drawNode.RemoveAll(); //need to remove the entire node
}
答案 0 :(得分:60)
这应该适合你:
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);
答案 1 :(得分:4)
您无法轻松使用迭代器(foreach-statement)删除节点。 在我看来,你可以做到以下几点:
1)在foreach循环中,保存应删除的所有元素的列表。然后,您只需遍历这些元素并将其删除。
2)使用普通的for循环并跟踪删除一个项目后要访问的下一个元素。
编辑:当使用for循环时,按照Fredrik建议的方式进行,循环向后。
答案 2 :(得分:4)
如果您尝试从XML DOM中删除节点,则这不是正确的方法。因为XMLNodeList
只是一个节点列表。而是要从父节点中删除节点。像这样:
XmlNode parentNode = // some value
XmlNode drawNode = // some value
parentNode.ParentNode.RemoveChild(drawNode);
答案 3 :(得分:2)
以下不是更简单:
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);
答案 4 :(得分: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();
答案 5 :(得分:0)
在我看来,您正在尝试删除整个XML元素...
如果这是您的XML ...
<Xml1>
<body>
<Book>
<Title name="Tom Sawyer" />
<Author value="Mark Twain" />
</Book>
<Book>
<Title name="A Tale of Two Cities" />
<Author value="Charles Dickens" />
</Book>
</body>
</Xml1>
如果您想删除一本书,则需要获取第一个<Book>
节点。您可以执行以下操作:
XmlDocument doc = new XmlDocument();
doc.Load(fileName);
XmlNodeList nodes = doc.GetElementsByTagName("body");
XmlNode bodyNode = nodes[0];
XmlNode firstBook = bodyNode.ChildNodes[0];
拥有“第一本书”节点后,您可以使用以下方法将其从正文节点中删除:
bodyNode.RemoveChild(firstBook);
这将自动影响/更新XML Document变量,因此doc
现在将仅具有:
<Xml1>
<body>
<Book>
<Title name="A Tale of Two Cities" />
<Author value="Charles Dickens" />
</Book>
</body>
</Xml1>
如果您想获取并删除整个body
,则应该可以:
XmlNodeList xml1 = doc.GetElementsByTagName("Xml1");
XmlNode xmlNode = xml[0];
xmlNode.RemoveChild(bodyNode);
然后doc
变量将被更新为不再包含body
元素,然后可以重新保存到文件系统中:
doc.Save(fileName);
fileName
是计算机上XML文档的完整路径。
最重要的是,我们没有使用doc.SelectNodes()
,因此我们不必担心使用XMLNamespaceManager
。