有一个HTML文件(我无法控制其内容),其中有多个input
个元素都具有id
的固定"search_query"
属性。该文件的内容可能会更改,但我知道我总是想要获取id属性为input
的第二个"search_query"
元素。
我需要一个XPath表达式才能执行此操作。我试过了//input[@id="search_query"][2]
,但这不起作用。以下是此查询失败的示例XML字符串:
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
请记住,上面只是一个示例,其他HTML代码可能完全不同,input
元素可以出现在任何地方,没有一致的文档结构(除了我保证总会有至少两个{id}属性为input
的{{1}}元素。
什么是正确的XPath表达式?
答案 0 :(得分:197)
这是常见问题解答:
//somexpression[$N]
表示“查找由//somexpression
选择的每个节点,即其父节点的$N
子节点。”
你想要的是:
(//input[@id="search_query"])[2]
记住:[]
运算符的优先级(优先级)高于//
缩写。
答案 1 :(得分:14)
这似乎有效:
/descendant::input[@id="search_query"][2]
我从迈克尔凯的“XSLT 2.0和XPath 2.0程序员参考,第4版”中了解到这一点。
XML路径语言规范http://www.w3.org/TR/xpath/#path-abbrev的“缩写语法”部分中还有一个注释提供了线索。