82

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

但这行不通。是否可以向 提供 XPath 查询XElement?我可以使用较旧的System.Xml框架来做到这一点,例如:

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

LINQ 命名空间中有类似的东西吗?


更新:

在胡思乱想之后,我找到了一种方法来做我想做的事情:

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

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

4

5 回答 5

145

要将 XPath 与 LINQ to XML 结合使用,请添加 using 声明 for System.Xml.XPath,这会将 的扩展方法System.Xml.XPath.Extensions纳入范围。

在您的示例中:

var value = (string)xml.XPathEvaluate("/response/data/hash");
于 2010-09-04T15:50:22.913 回答
39

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

但是,为了提供许多替代方案,请考虑XPathSelectElementXPathSelectElementsXPathEvaluate针对 an 评估 XPath 表达式XNode(它们都是 上的扩展方法XNode)。您还可以使用CreateNavigator为.XPathNavigatorXNode

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

于 2010-09-04T15:49:39.063 回答
14

看,在处理 LINQ to 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 我希望这会对你有所帮助。

于 2010-09-04T15:32:57.613 回答
9

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

对于您的示例:

XElement xml = XElement.Parse(@"...your xml...");
XElement hash = xml.Element("data").Element("hash");
于 2013-10-23T20:01:44.973 回答
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

于 2014-02-02T01:21:27.213 回答