C# XML Xpath表达式

C# XML Xpath表达式,c#,xml,xpath,C#,Xml,Xpath,我试图获取运行时值大于输入值的元素title和runtime(同级)。我的带有XPath表达式的C#代码是: ElementValue = 140; nodeList = root.SelectNodes(@"/moviedb/movie[./runtime>'" + ElementValue + "'/title | /moviedb/movie[./runtime>'" + ElementValue + "']/runtime"); 此XPath表达式没有返回任何内容 我的X

我试图获取运行时值大于输入值的元素titleruntime(同级)。我的带有XPath表达式的C#代码是:

ElementValue = 140;

nodeList = root.SelectNodes(@"/moviedb/movie[./runtime>'" + ElementValue + "'/title | /moviedb/movie[./runtime>'" + ElementValue + "']/runtime");
此XPath表达式没有返回任何内容

我的XML文件:

  <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>

tt0120689
犯罪、戏剧、幻想、神秘
英语、法语
美国
8.5
189
绿色英里
1999
tt0415800
动作、动画、戏剧、惊悚片
英语
美国
4.5
139
搏击俱乐部
2004

您可以改用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;
}

您可以改为使用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);
}

您似乎正在将想要从节点中应用的值作为筛选条件,这是行不通的。我将采用另一种方法,首先找到满足条件的节点:

nodeList = root.SelectNodes(@"/moviedb/movie[runtime > " + ElementValue + "]");
然后从每个元素中获取子元素:

foreach (var node in nodeList)
{
    Debug.WriteLine(node.SelectSingleNode("title").InnerText);
    Debug.WriteLine(node.SelectSingleNode("runtime").InnerText);
}

通过执行
联合
|
运算符,可以使用单个XPath表达式来实现这一点。正如在这里的其他答案中所提到的,您的select在谓词中,这无论如何都不会为您提供正确的答案

注意,如果要查看一个数字是否大于另一个数字,除非您使用的是支持模式驱动的数据类型的XQuery引擎,否则您需要在执行比较之前将
text()
强制转换为一个数字。在本例中,我假设
xs:int
将适合您。您还可以使用原子的
gt
,而不是
=
,后者可能更有效

ElementValue = 140;

nodeList = root.SelectNodes(@"/moviedb/movie[xs:int(runtime) gt " + ElementValue + "]/(title | runtime)");

通过执行
联合
|
运算符,可以使用单个XPath表达式来实现这一点。正如在这里的其他答案中所提到的,您的select在谓词中,这无论如何都不会为您提供正确的答案

注意,如果要查看一个数字是否大于另一个数字,除非您使用的是支持模式驱动的数据类型的XQuery引擎,否则您需要在执行比较之前将
text()
强制转换为一个数字。在本例中,我假设
xs:int
将适合您。您还可以使用原子的
gt
,而不是
=
,后者可能更有效

ElementValue = 140;

nodeList = root.SelectNodes(@"/moviedb/movie[xs:int(runtime) gt " + ElementValue + "]/(title | runtime)");

什么是
nodeList
,什么是
root
。我们可以猜测,但要创建一个完整的示例。什么是
nodeList
,什么是
root
。我们可以猜测,但要创建一个完整的示例。