2009-01-15 51 views
4

我想知道什麼是「最佳實踐」的方式(在C#)是實現與LINQ此XPath查詢:什麼的LINQ to XML相當於對這個XPath

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

我想的一個IEnumerable列表'nodesIWantReturned',但只能來自XML樹的某個部分,取決於祖先屬性的值。

+0

的可能的複製[如何使用XPath用的XElement或LINQ?](http://stackoverflow.com/questions/3642829/how-to-use-xpath-with-xelement-or-linq) – 2016-09-01 07:12:53

回答

0

口頭解決方案:

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

這將無法正常工作。如果遇到缺少該屬性的元素,它將拋出NullReferenceException。 – 2009-01-16 13:17:30

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

前三個節點選擇使用.Elements而不是.Descendants會更安全嗎?如果節點IwantReturned的內容匹配,派生可能會達到太多? – Kev 2009-01-15 22:58:16

+0

嗯,是的。謝謝。看起來我很困:)編輯 – 2009-01-15 23:15:21

10

除了所示的LINQ的方法,你也可以導入System.Xml.XPath命名空間,然後使用XPathSelectElements擴展方法,直接使用XPath查詢。

在這個類中我們注意到這些方法比'正確的'Linq-to-XML慢,但是很多時候這並不太重要,有時使用XPath更容易一些(它當然是一個很多terser!)。

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