Xpath找到第一个出现的两个不同元素

时间:2013-09-25 20:39:47

标签: c# xml xpath xpathnavigator

使用下面的示例,我想使用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。

3 个答案:

答案 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,我希望这就是您所寻找的。

答案 2 :(得分:1)

这个XPath表达式可以工作:

//*[local-name()='b' or local-name()='d'][1]

或者对于更短的解决方案,您可以尝试这样做:

(//b|//d)[1]

两个表达式将按照它们出现的顺序选择b元素或d元素,并仅从结果集中选择第一个元素。