如何与XElement或LINQ一起使用XPath?

考虑以下XML:

<response> <status_code>200</status_code> <status_txt>OK</status_txt> <data> <url>http://bit.ly/b47LVi</url> <hash>b47LVi</hash> <global_hash>9EJa3m</global_hash> <long_url>http://www.tumblr.com/docs/en/api#api_write</long_url> <new_hash>0</new_hash> </data> </response> 

我正在寻找一个非常简短的方法来获取<hash>元素的值。 我试过了:

 var hash = xml.Element("hash").Value; 

但是这不起作用。 有没有可能为XElement提供XPath查询? 我可以用旧的System.Xml框架来做,就像这样做:

 xml.Node("/response/data/hash").Value 

在LINQ命名空间中是否有这样的东西?


更新:

在这个瞎猜之后,我发现了一个办法来做我想做的事情:

 var hash = xml.Descendants("hash").FirstOrDefault().Value; 

我仍然有兴趣看看有没有更好的解决scheme?

若要使用带有LINQ to XML的XPath,请为System.Xml.XPath添加一个using声明,这将使System.Xml.XPath的扩展方法进入范围。

在你的例子中:

 var value = (string)xml.XPathEvaluate("/response/data/hash"); 

其他人则完全合理地build议如何使用“原生”的LINQ to XML查询来做你想做的事情。

但是,为了提供大量替代方法,请考虑XPathSelectElementXPathSelectElementsXPathEvaluate以针对XNode评估XPathexpression式(它们都是XNode上的扩展方法)。 您还可以使用CreateNavigatorXNode创buildXPathNavigator

就我个人而言,我是直接使用LINQ to XML API的忠实粉丝,因为我是一个很大的LINQ粉丝,但是如果您对XPath更加熟悉,以上内容可能对您有所帮助。

看,当处理LINQ到XML为什么不使用LINQ来获取实际的对象。

后代从整个XML中查找每个元素,并列出与指定名称匹配的所有对象。 所以在你的情况下,散列是它发现的名字。

所以,而不是做

 var hash = xml.Descendants("hash").FirstOrDefault().Value; 

我会分裂像:

 var elements = xml.Descendants("hash"); var hash = elements.FirstOrDefault(); if(hash != null) hash.Value // as hash can be null when default. 

这样你也可以获得属性,节点元素等

检查这篇文章得到清楚的想法,以便它帮助。 http://www.codeproject.com/KB/linq/LINQtoXML.aspx我希望这会帮助你。;

您可以使用.Element()方法链接元素以形成类似XPath的结构。

举个例子:

 XElement xml = XElement.Parse(@"...your xml..."); XElement hash = xml.Element("data").Element("hash"); 

我试图想出一个用于生成xpath的LINQesq框架。 它可以让你用c#lambdaexpression式来描述xpath

 var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && e.Parent.Name == "tr"); var xpath = CreateXpath.Where(e => e.TargetElementName == "td").Select(e => e.Text); 

不确定这是否有帮助,但您可以在这里find文档:

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq