有一个 HTML 文件(其内容不受我控制)具有多个 input
元素,它们都具有相同的 "search_query"
固定 id
属性。文件的内容可以更改,但我知道我总是想获得第二个具有 id 属性 "search_query"
的 input
元素。
我需要一个 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
元素可以出现在没有一致文档结构的任何地方(除非我保证总会有至少两个 input
id 属性为 "search_query"
的元素)。
什么是正确的 XPath 表达式?
这是一个常见问题解答:
//somexpression[$N]
表示“查找 //somexpression
选择的每个节点,它是其父节点的 $N
th 子节点”。
你想要的是:
(//input[@id="search_query"])[2]
记住:[]
运算符的优先级(优先级)高于 //
缩写。
这似乎有效:
/descendant::input[@id="search_query"][2]
我从 Michael Kay 的“XSLT 2.0 和 XPath 2.0 程序员参考,第 4 版”中得到这个。
XML 路径语言规范 http://www.w3.org/TR/xpath/#path-abbrev 的“缩写语法”部分中还有一条注释提供了线索。
不定期副业成功案例分享
//input[@id='search_query'][2]
的未缩写形式是:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]