comment faire pour supprimer tous les childnodes de la xmlnode spécifié en C# 4.0?
C'est mon xml.
<Document>
<page no="1">
<Paragraph no="1">
<Line>line1</Line>
</Paragraph>
<Paragraph no="2">
<Line>line2</Line>
</Paragraph>
</page>
<page no="2">
<Paragraph no="1">
<Line>line1</Line>
</Paragraph>
<Paragraph no="2">
<Line>line2</Line>
</Paragraph>
</page>
</Document>
Mon code C# est
XmlDocument xd = new XmlDocument();
xd.Load(@"H:\Sample-8-final.xml");
XmlNodeList pnodelist = xd.GetElementsByTagName("page");
XmlNodeList xdChildNodeList = xd.ChildNodes;
for (int i = 0; i < pnodelist.Count; i++)
{
XmlNode pageNode = pnodelist[i];
foreach (XmlNode xxNode in pageNode.ChildNodes)
{
if (xxNode.Name.ToString().Trim().Equals("Paragraph"))
{
foreach (XmlNode yyNode in xxNode.ChildNodes)
{
yyNode.ParentNode.RemoveChild(yyNode);
}
}
}
xd.Save(@"H:\Sample-8-final_1.xml");
ma sortie Requise est
<Document>
<page no="1">
<Paragraph no="1">
</Paragraph>
<Paragraph no="2">
</Paragraph>
</page>
<page no="2">
<Paragraph no="1">
</Paragraph>
<Paragraph no="2">
</Paragraph>
</page>
</Document>
mais mon code produit mauvais résultat comme ci-dessous:
<Document>
<page no="1">
<Paragraph no="1">
</Paragraph>
<Paragraph no="2">
<Line>line2</Line>
</Paragraph>
</page>
<page no="2">
<Paragraph no="1">
</Paragraph>
<Paragraph no="2">
<Line>line2</Line>
</Paragraph>
</page>
</Document>
Merci de me Guider pour sortir de ce problème...
Vous devez vous connecter pour publier un commentaire.
Utiliser LINQ to XML pour supprimer tous les descendants de l'Alinéa éléments:
Remarque: vous avez besoin de mettre
using System.Xml.Linq;
en haut de votre fichier.Le problème, c'est que vous sont en train de changer la chose, vous êtes à parcourir dans ces lignes:
C'est plus facile à repérer si vous avez été à remplacer
yyNode.ParentNode
avecxxNode
(c'est garanti que). Ceci est à l'origine de l'itérateur de se confondre et d'ignorer certaines choses que vous ne voulez pas qu'il.Probablement plus facile si c'est juste pour appeler
xxNode.RemoveAll()
. Voir les docs: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.removeallToutefois noter que, comme Mahen dit cela permettra d'éliminer vos attributs en tant que bien si souvent, n'est pas la solution souhaitée (et pas dans ce cas par exemple).
il n'y a pas de problème avec le code, vous avez juste à être précis avec votre littéraux. ils sont sensibles à la casse.
écrire "page" au lieu de "PAGE" et "Paragraphe" au lieu de "PARAGRAPHE", puis le code fonctionne très bien.
Chris a expliqué que l'itération échoue parce que vous êtes à la modification de
ChildNodes
(en les supprimant) que vous êtes une itération à travers cette collection. Il a suggéré d'utiliserRemoveAll()
à la place. MaisRemoveAll()
supprime les attributs ainsi que des éléments d'enfant, qui n'est pas ce que je veux. C'est donc ce que j'ai écrit pour itérer en toute sécurité tout en conservant les attributs (en VB.NET):