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
}
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);
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.
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);
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);
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();
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);
Où 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
.