如何在XElement或LINQ中使用XPath?

时间:2010-09-04 15:19:34

标签: .net xml xpath linq-to-xml xelement

考虑以下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;

我仍然有兴趣看看是否有人有更好的解决方案?

5 个答案:

答案 0 :(得分:132)

要使用带有LINQ to XML的XPath为System.Xml.XPath添加使用声明,这会将System.Xml.XPath.Extensions的扩展方法纳入范围。

在你的例子中:

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

答案 1 :(得分:38)

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

但是,为了提供大量备选方案,请考虑XPathSelectElementXPathSelectElementsXPathEvaluate来评估针对XNode的XPath表达式(它们都是扩展方法)在XNode)。您还可以使用CreateNavigatorXPathNavigator创建XNode

我个人非常喜欢直接使用LINQ to XML API,因为我是一个很大的LINQ粉丝,但如果你对XPath更熟悉,上面的内容可能对你有所帮助。

答案 2 :(得分:14)

在处理LINQ to XML时,为什么不使用LINQ来获取实际对象。

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

所以,而不是做

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 我希望这能帮到您。

答案 3 :(得分:8)

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

对于你的例子:

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

答案 4 :(得分:2)

我试图想出一个用于生成xpath的LINQesq框架。 它允许您使用c#lambda表达式

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

不确定这在此上下文中是否有用,但您可以在此处找到文档:

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