如何与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查询来做你想做的事情。
但是,为了提供大量替代方法,请考虑XPathSelectElement
, XPathSelectElements
和XPathEvaluate
以针对XNode
评估XPathexpression式(它们都是XNode
上的扩展方法)。 您还可以使用CreateNavigator
为XNode
创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