/ / Ajouter un nouvel élément XML via LINQ lorsque le chemin est variable - c #, xml, linq

Ajouter un nouvel élément XML via LINQ lorsque le chemin est variable - c #, xml, linq

Avoir un petit problème avec l'utilisation de XElement / LINQ pour ajouter un nouvel élément, lorsque le chemin est inconnu, et que je suis assez nouveau pour LINQ également. En C #, Winforms

Edit: Les valeurs "ID" dans le fichier xml sont en réalité des GUID, simplement coupées ici pour faciliter la lecture.

Par exemple, si j'ai le fichier XML ci-dessous:

<?xml version="1.0" encoding="utf-8"?>
<Root>
<Structure>
<Nodes>
<Node ID="1" Name="A" />
<Node ID="2" Name="B" />
<Node ID="3" Name="C" >
<Nodes>
<Node ID="4" Name="D" />
<Node ID="5" Name="E" >
<Nodes>
<Node ID="6" Name="F" />
</Nodes>
</Node>
</Nodes>
</Node>
</Nodes>
</Structure>
</Root>

Ensuite, mon extrait de code pour l'insertion d'un nouveau nœud (ID = 7 Nom = G) sous le nœud 2 / B est: (Remarque: j'identifie précédemment la cible, dans ce cas 2, codée en dur pour des raisons de concision)

// Add Node:
_XML_Modify.Element("Structure")
.Elements("Nodes")
.Elements("Node")
.Where(item => item.Attribute("ID").Value == 2).FirstOrDefault()
.AddAfterSelf(new XElement("Node",
new XAttribute("ID", 7),
new XAttribute("Name", "G")
));

Mais comment puis-je ajouter un nouveau nœud si je ne suis pas sûr de la cible? Si par exemple ajouter le nouveau noeud sous le noeud 4 / D ou 6 / F où le chemin est différent de ce qui précède.

Est-il préférable d'utiliser la récursivité pour trouver ma ciblenoeud dans ce scénario? "J’ai essayé cela et je me suis débattu un peu, mais je pense faire une" Recherche ", puis si elle a des nœuds enfants, appelez de manière récursive jusqu’à ce que le nœud cible soit trouvé.

Réponses:

1 pour la réponse № 1

Si je comprends bien, vous pouvez utiliser Descendants() pour trouver un nœud sans connaître le chemin exact du nœud. Par exemple, pour ajouter le nouveau noeud après noeud avec ID=6 :

_XML_Modify.Descendants("Node")
.FirstOrDefault(o => (int)o.Attribute("ID") == 6)
.AddAfterSelf(new XElement("Node",
new XAttribute("ID", 7),
new XAttribute("Name", "G")
));

Notez que cette approche peut être plus lente que l’utilisation de chemins plus spécifiques, en particulier pour les documents XML volumineux, car Descendants() tentera de trouver des nœuds correspondants dans toutes les branches.