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