如果我的文档中包含多个具有相同名称的元素,该怎么办?例如,如何检索第二个元素?
<doc>
...
<element name="same">foo</element>
...
<element name="same">bar</element>
...
<element name="same">baz</element>
...
</doc>
我希望像// elem [@ name ='same'] [2]这样的东西可以工作。
此外,我如何找到xpath中最后一个元素的第二个元素,其中包含可变数量的具有相同名称的元素
答案 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]
最后,一个必要的警告:使用“//”缩写非常昂贵,因为它会导致遍历整个(子)树。每当知道文档结构时,建议使用更具体的结构(位置路径)。