我需要根据条件删除一个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);
XmlNamespacemanager
,另一个不需要:https://learn.microsoft.com/en-us/dotnet/api/system.xml.xmlnode.selectnodes?view=netframework-4.7.2#System_Xml_XmlNode_SelectNodes_System_String_ - Fredrik MörkXmlNamespaceManager
的重载版本,否则可以使用更简单的版本。 - Fredrik Mörk如果您想从XML DOM中删除节点,那么这不是正确的方法。因为XMLNodeList
只是节点列表。相反,您需要从父节点中删除该节点。像这样:
XmlNode parentNode = // some value
XmlNode drawNode = // some value
parentNode.ParentNode.RemoveChild(drawNode);
drawNode
是parentNode
的子节点,你不需要使用.ParentNode
。你可以直接使用parentNode.RemoveChild(drawNode);
。 - vapcguy您不能轻易地使用迭代器(foreach语句)来删除节点。据我所见,您可以执行以下操作:
1)在您的for-each循环中,保存应删除的所有元素的列表。然后,只需循环遍历这些元素并将其删除。
2)使用普通的for循环,并在删除一个项目后跟踪要访问的下一个元素。
编辑:使用for循环时,请按照Fredrik的建议向后循环。
看起来你只是尝试删除整个 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文档变量,因此doc
现在只会有:
<Xml1>
<body>
<Book>
<Title name="A Tale of Two Cities" />
<Author value="Charles Dickens" />
</Book>
</body>
</Xml1>
XmlNodeList xml1 = doc.GetElementsByTagName("Xml1");
XmlNode xmlNode = xml[0];
xmlNode.RemoveChild(bodyNode);
变量doc
将被更新,不再包含body
元素,然后可以重新保存到文件系统中:
doc.Save(fileName);
在此处,fileName
是您计算机上 XML 文档的完整路径。
最棒的是,我们没有使用 doc.SelectNodes()
,因此我们不需要担心使用 XMLNamespaceManager
。
这不是更简单吗:
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);
doc.SelectNodes()
需要一个 XMLNamespaceManager。 - vapcguy 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();