Мне нужно удалить XmlNode на основе условия. Как это сделать?
foreach (XmlNode drawNode in nodeList)
{
//Based on a condition
drawNode.RemoveAll(); //need to remove the entire node
}
Мне нужно удалить 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);
Если вы пытаетесь удалить node из XML DOM, это неверный путь. Поскольку XMLNodeList
- это всего лишь список узлов. Скорее вы хотите удалить node из родительского node. Вот так:
XmlNode parentNode = // some value
XmlNode drawNode = // some value
parentNode.ParentNode.RemoveChild(drawNode);
Вы не можете легко использовать итераторы (foreach-statement) для удаления ваших узлов. Как я вижу, вы можете сделать следующее:
1) В вашем цикле foreach сохраните список всех элементов, которые необходимо удалить. Затем вы просматриваете только те элементы и удаляете их.
2) Используйте обычный цикл for и отслеживайте, какой следующий элемент следует посетить после того, как вы удалили один элемент.
Edit: При использовании for-loop делайте это так, как предлагает Fredrik, зацикливая назад.
Не следующее немного проще:
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();