web-dev-qa-db-fra.com

Comment supprimer un XmlNode de XmlNodeList

Je dois supprimer un XmlNode basé sur une condition. Comment faire?

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

}
27
siva

Cela devrait faire l'affaire pour vous:

for (int i = nodeList.Count - 1; i >= 0; i--)
{
    nodeList[i].ParentNode.RemoveChild(nodeList[i]);
}

Si vous passez en boucle avec une boucle for régulière et que vous passez par-dessus "en arrière", vous pouvez supprimer des éléments au fur et à mesure.

Mise à jour: voici un exemple complet, comprenant le chargement d'un fichier XML, la localisation des nœuds, leur suppression et l'enregistrement du fichier:

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);
60
Fredrik Mörk

Vous ne pouvez pas facilement utiliser les itérateurs (foreach-statement) pour supprimer vos nœuds . Comme je le vois, vous pouvez procéder comme suit:

1) Dans votre boucle foreach, enregistrez une liste de tous les éléments à supprimer. Ensuite, vous parcourez uniquement ces éléments et les supprimez.

2) Utilisez une boucle for ordinaire et gardez une trace de l'élément à visiter après avoir supprimé un élément.

Edit: Lorsque vous utilisez une boucle for, faites-le comme Fredrik le suggère, en boucle arrière.

4
Daniel Wedlund

Si vous essayez de supprimer un nœud du DOM XML, ce n'est pas la bonne façon. Parce qu'une XMLNodeList est juste une liste de nœuds. Vous souhaitez plutôt supprimer le nœud du nœud parent. Comme ça:

XmlNode parentNode = // some value
XmlNode drawNode = // some value
parentNode.ParentNode.RemoveChild(drawNode);
4
Keltex

Ce qui suit n'est-il pas un peu plus simple:

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); 
2
Rudy Schockaert
    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();
0
milind Morey

Il me semble que vous essayez simplement de supprimer un élément XML entier ...

Si c'est votre 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>

Si vous souhaitez supprimer un livre, vous devez récupérer le premier noeud <Book>. Vous pouvez le faire avec:

XmlDocument doc = new XmlDocument();
doc.Load(fileName);

XmlNodeList nodes = doc.GetElementsByTagName("body");
XmlNode bodyNode = nodes[0];
XmlNode firstBook = bodyNode.ChildNodes[0];

Une fois que vous avez le nœud "premier livre", vous pouvez le supprimer du nœud du corps en utilisant:

bodyNode.RemoveChild(firstBook);

Ceci affectera/mettra à jour automatiquement la variable Document XML, donc doc n'aura plus que:

<Xml1>
  <body>
    <Book>
      <Title name="A Tale of Two Cities" />
      <Author value="Charles Dickens" />
    </Book>
  </body>
</Xml1>

Si vous voulez récupérer et supprimer la totalité de la body, vous devriez pouvoir faire:

XmlNodeList xml1 = doc.GetElementsByTagName("Xml1");
XmlNode xmlNode = xml[0];
xmlNode.RemoveChild(bodyNode);

Et la variable doc sera mise à jour pour ne plus contenir l'élément body et pourra ensuite être réenregistrée dans le système de fichiers:

doc.Save(fileName);

fileName est le chemin complet du document XML sur votre ordinateur.

Mieux encore, nous n'utilisons pas doc.SelectNodes(); nous n'avons donc pas à nous soucier de l'utilisation de XMLNamespaceManager.

0
vapcguy