C# 这个XPath的LINQ到XML等价物是什么

C# 这个XPath的LINQ到XML等价物是什么,c#,xml,linq,xpath,C#,Xml,Linq,Xpath,我想知道用LINQ实现这个xpath查询的“最佳实践”方法是什么(在C中): /topNode/middleNode[@filteringAttribute='filterValue']/penultimateNode[@anotherFilterAttribute='somethingElse']/nodesIWantReturned 我想要一个“nodesIWantReturned”的IEnumerable列表,但仅来自XML树的某个部分,具体取决于祖先属性的值。更口头的解决方案: var

我想知道用LINQ实现这个xpath查询的“最佳实践”方法是什么(在C中):

/topNode/middleNode[@filteringAttribute='filterValue']/penultimateNode[@anotherFilterAttribute='somethingElse']/nodesIWantReturned
我想要一个“nodesIWantReturned”的IEnumerable列表,但仅来自XML树的某个部分,具体取决于祖先属性的值。

更口头的解决方案:

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

除了所示的Linq方法外,还可以导入
System.Xml.XPath
命名空间,然后使用扩展方法直接使用XPath查询

在这个类中需要注意的是,这些方法比“适当的”Linq到XML要慢,但是很多时候这并不太重要,而且有时候仅仅使用XPath更容易(当然要简洁得多!)


对于前三个节点选择,使用.Elements而不是.substands不是更安全吗。如果nodesIWantReturned的内容匹配,后代可能会走得太远?嗯,是的。谢谢看起来我困了:)编辑这不能正常工作。如果遇到缺少该属性的元素,它将抛出NullReferenceException。谢谢!好提示!将注意到这是较慢的。可能重复
var result = doc.XPathSelectElements("your xpath here");