使用下面的示例,我想使用xPath查找两个不同元素的第一个出现。例如,我想弄清楚b或d是否首先出现。我们可以明显地告诉b在d之前出现(自上而下,而不是在树级)。但是,我如何使用xpath解决这个问题?
<a>
<b>
</b>
</a>
<c>
</c>
<d>
</d>
现在,我通过获取节点集中的第一个元素找到节点(在本例中为b和d),我使用以下代码找到它:
String xPathExpression = "//*[local-name()='b']";
XPathNodeIterator nodeSet = (XPathNodeIterator)navigator.Evaluate(xPathExpression);
和
String xPathExpression = "//*[local-name()='d']";
XPathNodeIterator nodeSet = (XPathNodeIterator)navigator.Evaluate(xPathExpression);
现在使用xpath,我无法弄清楚哪个先来,b或d。
答案 0 :(得分:4)
您希望以文档顺序扫描树(元素出现的顺序)。好像偶然这是默认的搜索顺序,而您所要做的就是选择第一个元素<b/>
或<d/>
节点:
//*[local-name() = 'b' or local-name() = 'd'][1]
如果您想要名称,请添加另一个local-name(...)
来电:
local-name(//*[local-name() = 'b' or local-name() = 'd'][1])
答案 1 :(得分:3)
如果您想使用LINQ to XML来解决相同的解决方案,可以尝试以下方法:
XDocument xmlDoc = new XDocument(filepath);
XElement first = (from x in xmlDoc.Descendants()
where x.Name == "b" || x.Name == "d"
select x).FirstOrDefault();
现在你可以运行一个简单的if语句,以确定“b”或“d”是否是找到符合我们标准的第一个元素。
if(first.Name.Equals("b")
//code for b being first
else if(first.Name.Equals("d")
//code for d being first
根据评论员的建议,您的代码使用lambda表达式而不是完整的LINQ查询会更清晰,但如果您不熟悉LINQ,这有时会让您感到困惑。以下是我上面XElement
作业的完全相同的查询:
XElement first = xmlDoc.Descendants().FirstOrDefault(x => x.Name == "b" || x.Name == "d");
如果您愿意不使用xpath,我希望这就是您所寻找的。 p>
答案 2 :(得分:1)
这个XPath表达式可以工作:
//*[local-name()='b' or local-name()='d'][1]
或者对于更短的解决方案,您可以尝试这样做:
(//b|//d)[1]
两个表达式将按照它们出现的顺序选择b
元素或d
元素,并仅从结果集中选择第一个元素。