2009-11-18 3 views
0

J'ai un problème. J'ai des données XML hiérarchiques tels que:XElement.Descendants ("Node") ne se comporte pas comme prévu, renvoie plusieurs niveaux de descendants

<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 Au fait que tous les nœuds sont "Node", 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 une requête SQL 2008 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)

Répondre

0

Nous avons donc ceci ...

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); 

Le meilleur moyen que j'ai trouvé était de supprimer tous les éléments enfants après avoir fait 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(); 
    } 
} 

qui sortie ce que vous avez voulu, mais je dois ajouter ... Il est très certainement une meilleure façon de le faire. Je ne sais pas à quel point cela fonctionnera avec votre situation, étant donné que la plupart des codes écrits doivent fonctionner de façon plus dynamique.

J'ai vu cette question et j'ai décidé de plonger dans Linq, je suppose que ce n'était pas si mal. Si cela ne fonctionne pas comme il le faut, au moins c'est un début.

+0

Merci de votre contribution. Je faisais la même chose. Je me demande simplement s'il y a un moyen plus rapide. Optionnellement, une requête XML SQL 2008 serait géniale mais je ne trouve aucun moyen d'obtenir uniquement le jeu de nœuds dont j'ai besoin. Je voudrais éviter de charger dans XML énorme ram quand en réalité j'ai juste besoin de l'une des nombreuses branches, et seulement un niveau de cette branche. – mfr

Questions connexes