C# XML Xpath表达式
我试图获取运行时值大于输入值的元素title和runtime(同级)。我的带有XPath表达式的C#代码是: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
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
。我们可以猜测,但要创建一个完整的示例。