XML Xpath expression
本文关键字:expression Xpath XML | 更新日期: 2023-09-27 18:01:46
我试图获得标题和运行时(兄弟姐妹)的元素,其中运行时值大于输入值。我使用XPath表达式的c#代码是:
ElementValue = 140;
nodeList = root.SelectNodes(@"/moviedb/movie[./runtime>'" + ElementValue + "'/title | /moviedb/movie[./runtime>'" + ElementValue + "']/runtime");
这个XPath表达式没有返回任何东西。
My XML file:
<moviedb>
<movie>
<imdbid>tt0120689</imdbid>
<genres>Crime,Drama,Fantasy,Mystery</genres>
<languages>English,French</languages>
<country>USA</country>
<rating>8.5</rating>
<runtime>189</runtime>
<title lang="english">The Green Mile</title>
<year>1999</year>
</movie>
<movie>
<imdbid>tt0415800</imdbid>
<genres>Action,Animation,Drama,Thriller</genres>
<languages>English</languages>
<country>USA</country>
<rating>4.5</rating>
<runtime>139</runtime>
<title lang="english">Fight Club</title>
<year>2004</year>
</movie>
</moviedb>
您可以使用linq2xml
var doc=XDocument.Load(path);
var movies=doc.Elements("movie")
.Where(x=>(int)x.Element("runtime")>input)
.Select(x=>new
{
Title=x.Element("title").Value,
Runtime=(int)x.Element("runtime")
});
现在可以遍历影片
foreach(var movie in movies)
{
movie.Title;
movie.Runtime;
}
您似乎将想要的值从节点上应用为过滤标准,这不起作用。我将采用另一种方法,首先找到符合条件的节点:
nodeList = root.SelectNodes(@"/moviedb/movie[runtime > " + ElementValue + "]");
然后从每个元素中抓取子元素:
foreach (var node in nodeList)
{
Debug.WriteLine(node.SelectSingleNode("title").InnerText);
Debug.WriteLine(node.SelectSingleNode("runtime").InnerText);
}
您可以通过执行union
(即|
操作符)来使用单个XPath表达式来完成此操作。正如在这里的其他答案中提到的,您在谓词中有选择,无论如何都不会为您产生正确的答案。
注意,如果您想查看一个数字是否比另一个数字大,除非您使用的是Schema驱动的数据类型感知的XQuery引擎,否则您需要在执行比较之前将text()
转换为一个数字。在本例中,我假设xs:int
将适合您。此外,您可以使用原子gt
而不是=
, 可能更有效。
ElementValue = 140;
nodeList = root.SelectNodes(@"/moviedb/movie[xs:int(runtime) gt " + ElementValue + "]/(title | runtime)");