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>

XML Xpath expression

您可以使用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)");