Как удалить 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();
Другие вопросы по тегам