如何使用 XPath 与 XElement 或 LINQ?

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

我还是想看看有没有更好的解决办法?

65692 次浏览

看,当处理 LINQtoXML 时,为什么不使用 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 我希望这能帮到你。

其他人则完全合理地建议如何使用“原生”LINQtoXML 查询来完成您想要的任务。

然而,为了提供更多的替代方法,考虑使用 XPathSelectElementXPathSelectElementsXPathSelectElements0来根据 XNode计算 XPath 表达式(它们都是 XNode上的扩展方法)。还可以使用 XPathSelectElements1为 XNode创建 XPathNavigator

就我个人而言,我非常喜欢直接使用 LINQ to XML API,因为我是 LINQ 的忠实粉丝,但是如果您对 XPath 更感兴趣,以上内容可能会对您有所帮助。

要将 XPath 与 LINQtoXML 一起使用,需要为 System.Xml.XPath添加一个 using 声明,这将使 System.Xml.XPath.Extensions的扩展方法进入范围。

在你的例子中:

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

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

举个例子:

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

我曾尝试提出一个用于生成 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