1

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

4

3 回答 3

4

您想按文档顺序(元素出现的顺序)扫描树。好像这是默认搜索顺序一样,您所要做的就是选择第一个元素,即 a<b/><d/>节点:

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

如果您想要名称,请添加另一个local-name(...)调用:

local-name(//*[local-name() = 'b' or local-name() = 'd'][1])
于 2013-09-25T20:47:09.557 回答
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,我希望这就是您正在寻找的东西。

于 2013-09-25T21:04:56.673 回答
1

这个 XPath 表达式可以工作:

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

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

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

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

于 2013-09-25T20:55:47.563 回答