Как удалить XmlNode из XmlNodeList - PullRequest
27 голосов
/ 17 мая 2009

Мне нужно удалить XmlNode в зависимости от условия. Как это сделать?

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

}

Ответы [ 6 ]

60 голосов
/ 17 мая 2009

Это должно помочь вам:

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);
4 голосов
/ 17 мая 2009

Если вы пытаетесь удалить узел из XML DOM, это не правильный путь. Потому что XMLNodeList это просто список узлов. Скорее вы хотите удалить узел из родительского узла. Как это:

XmlNode parentNode = // some value
XmlNode drawNode = // some value
parentNode.ParentNode.RemoveChild(drawNode);
4 голосов
/ 17 мая 2009

Вы не можете легко использовать итераторы (оператор foreach) для удаления ваших узлов. Как я вижу, вы можете сделать следующее:

1) В вашем цикле foreach сохраните список всех элементов, которые должны быть удалены. Затем вы просматриваете только эти элементы и удаляете их.

2) Используйте обычный цикл for и отслеживайте, какой следующий элемент будет посещен после удаления одного элемента.

Редактировать: при использовании цикла for делайте так, как предлагает Фредрик, повторяя цикл назад.

2 голосов
/ 13 марта 2012

Не немного ли проще:

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); 
0 голосов
/ 15 ноября 2018

Мне кажется, вы пытаетесь удалить весь элемент 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-документа, поэтому 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.

0 голосов
/ 11 октября 2013
    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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...