2009-01-15 10 views
4

Je me demandais ce que la « meilleure pratique » (en C#) est de mettre en œuvre cette requête XPath avec LINQ:Quel est le LINQ pour XML équivalent pour cette XPath

/topNode/middleNode[@filteringAttribute='filterValue']/penultimateNode[@anotherFilterAttribute='somethingElse']/nodesIWantReturned 

Je voudrais une liste IEnumerable de la 'nodesIWantReturned', mais seulement à partir d'une certaine section de l'arbre XML, dépendant de la valeur des attributs ancêtres.

+0

double possible de [Comment utiliser XPath avec XElement ou LINQ?] (Http://stackoverflow.com/questions/3642829/how-to-use-xpath-with-xelement-or-linq) –

Répondre

0

Une plus solution verbale:

var nodesIWantReturned = from m in doc.Elements("topNode").Elements("middleNode") 
       from p in m.Elements("penultimateNode") 
       from n in p.Elements("nodesIWantReturned") 
       where m.Attribute("filteringAttribute").Value == "filterValue" 
       where p.Attribute("anotherFilterAttribute").Value == "somethingElse" 
       select n; 
+3

Cela ne fonctionnera pas correctement. Il va lancer une exception NullReferenceException si un élément auquel l'attribut manque est rencontré. –

3
var result = root.Elements("topNode") 
       .Elements("middleNode") 
       .Where(a => (string)a.Attribute("filteringAttribute") == "filterValue") 
       .Elements("penultimateNode") 
       .Where(a => (string)a.Attribute("anotherFilterAttribute") == "somethingElse") 
       .Elements("nodesIWantReturned"); 
+0

Ne serait-il pas plus sûr d'utiliser .Elements au lieu de .Descendants pour les trois premières sélections de noeuds? .Les descendants pourraient aller trop loin si le contenu de nodesIWantReturned a une correspondance? – Kev

+0

Euh, oui. Merci. On dirait que j'ai sommeil :) Modification –

10

En plus des méthodes Linq montrées, vous pouvez également importer l'espace de noms System.Xml.XPath puis utilisez la méthode d'extension XPathSelectElements utiliser directement votre requête XPath.

Il est noté dans la classe que ces méthodes sont plus lentes que Linq-to-XML "correct", mais la plupart du temps ce n'est pas trop important, et parfois il est plus facile d'utiliser XPath (c'est certainement un beaucoup terser!).

var result = doc.XPathSelectElements("your xpath here"); 
+2

Merci! Bon conseil! Notez que c'est plus lent. –

Questions connexes