XElement.Descendants ( « nœud ») ne se comporte pas comme prévu, renvoie plusieurs niveaux de descendants

StackOverflow https://stackoverflow.com/questions/1753518

  •  20-09-2019
  •  | 
  •  

Question

J'ai un problème. J'ai des données XML hiérarchiques tels que:

<Tree>
  <Node Text="Stuff" ItemGUID="064a9bf0-0594-47f8-87be-88dd73763c77" >
    <Node Text="Food" ItemGUID="326f1f7a-d364-4838-9bdc-ce5fd93f88ca" ItemType="2" />
    <Node Text="Wines" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
    <Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4">
        <Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f">
              <Node Text="Red" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
              <Node Text="Pink" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
              <Node Text="White" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        </Node>
        <Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        <Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
    </Node>
    <Node Text="Sweet Delights" ItemGUID="1df7dbae-adf0-49a9-aaac-1358468a245b" />
  </Node>
</Tree>

Et je dois obtenir simplement des fleurs (roses, tulipes, peu importe) sans rouge, rose, blanc (sous Roses)  J'utilise le code suivant, mais en raison du fait que tous les nœuds sont « nœud » Je reçois tous les niveaux de Descendats. Je voudrais limiter à un seul niveau.

XElement loadedXML = clients.ItemTreeXML;

//filter only current node
XElement procXML;
procXML = new XElement ("Tree",
          from el in loadedXML.Descendants("Node")
          where (string)el.Attribute("ItemGUID") == currentNodeGUID
          select el); 

Résultat Recherché:

<Tree>
        <Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4">
            <Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
            <Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
            <Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        </Node>
</Tree>

Merci,

Ajout: Peut-être un SQL 2008 requête pourrait retreive que la branche de nœud que j'ai besoin, mais après beaucoup de recherches et d'essais, je ne pouvais pas trouver une réponse ... (Mon XML est dans une colonne XML dans SQL 2008)

Était-ce utile?

La solution

Nous avons donc cette ...

XElement loadedXML = XElement.Load("test.xml");

//filter only current node
XElement procXML;
procXML = new XElement("Tree",
    from el in loadedXML.Descendants("Node")
    where (string)el.Attribute("ItemGUID") == currentNodeGUID
    select el);

La meilleure façon que j'ai trouvé pour supprimer tous les éléments de l'enfant après que vous faites la requête LINQ. Comme ceci:

foreach (XElement xl in procXML.Element("Node").Elements("Node"))
{
    if (xl.HasElements) // just remove the ones without child elements
    {
        xl.RemoveNodes();
    }
}

Cette sortie de volonté ce que vous avez voulu, mais je dois ajouter ... Il y a très certainement une meilleure façon de le faire. Je ne sais pas comment cela fonctionnera avec votre situation donnée la plupart des besoins de code écrit pour travailler de façon plus dynamique que cela.

J'ai vu cette question et a décidé de faire un plongeon dans Linq, je suppose que ce n'était pas si mal que ça. Si cela ne fonctionne pas seulement la façon dont il a besoin, au moins c'est un début.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top