如何在XPath中识别具有相同名称的多个元素?

时间:2008-11-26 19:11:16

标签: xml xpath

如果我的文档中包含多个具有相同名称的元素,该怎么办?例如,如何检索第二个元素?

<doc>
...
 <element name="same">foo</element>
...
 <element name="same">bar</element>
...
 <element name="same">baz</element>
...
</doc>

我希望像// elem [@ name ='same'] [2]这样的东西可以工作。

此外,我如何找到xpath中最后一个元素的第二个元素,其中包含可变数量的具有相同名称的元素

1 个答案:

答案 0 :(得分:20)

[ ]的优先级高于//(而“//”实际上只是缩写,而不是运算符)。是这样,因为根据XPath 1.0 Spec

“//是/ descendant-or-self :: node()/”

的缩写

以后:

注意:位置路径// 1与位置路径/后代:: para 1的含义不同。后者选择第一个后代para元素;前者选择所有后代para元素,这些元素是他们父母的第一个孩子。“

因此,XPath表达式:

//element[@name='same'][2]

表示:

选择文档中名为“element”的任何元素,其属性“name”的值为“same”,此元素是其父元素的第二个子元素。

你想要的是

(//element[@name='same'])[2]

注意括号,它覆盖[]。

的较高优先级

同样,以下XPath表达式选择了最后一个这样的节点

(//element[@name='same'])[last()-1]

最后,一个必要的警告:使用“//”缩写非常昂贵,因为它会导致遍历整个(子)树。每当知道文档结构时,建议使用更具体的结构(位置路径)。