如何从XmlNodeList中删除XmlNode

时间:2009-05-17 18:17:55

标签: c# xml

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

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

}

6 个答案:

答案 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