Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 获取元素第n个实例的XPath查询_Xml_Xpath - Fatal编程技术网

Xml 获取元素第n个实例的XPath查询

Xml 获取元素第n个实例的XPath查询,xml,xpath,Xml,Xpath,有一个HTML文件(其内容我不控制),其中包含多个输入元素,所有元素都具有“search\u query”的相同固定id属性。文件的内容可以更改,但我知道我总是希望获得第二个输入元素,该元素具有id属性“search\u query” 我需要一个XPath表达式来实现这一点。我尝试了//input[@id=“search\u query”][2],但没有成功。以下是此查询失败的示例XML字符串: <div> <form> <input id="searc

有一个HTML文件(其内容我不控制),其中包含多个
输入
元素,所有元素都具有
“search\u query”
的相同固定
id
属性。文件的内容可以更改,但我知道我总是希望获得第二个
输入
元素,该元素具有id属性
“search\u query”

我需要一个XPath表达式来实现这一点。我尝试了
//input[@id=“search\u 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代码可能完全不同,
输入
元素可能出现在任何没有一致文档结构的地方(除非我保证始终至少有两个id属性为
“search\u query”
输入
元素)

正确的XPath表达式是什么?

这似乎有效:

/descendant::input[@id="search_query"][2]
我是从Michael Kay的“XSLT 2.0和XPath 2.0程序员参考,第四版”开始的


XML路径语言规范的“缩写语法”部分中还有一个注释提供了线索

这是一个常见问题解答:

(//input[@id="search_query"])[2]
//somexpression[$N]

表示“查找由
//somexpression
选择的每个节点,该节点是其父节点的
$N
第个子节点”

您想要的是

(//input[@id="search_query"])[2]

记住
[]
运算符的优先级(priority)高于
/
缩写。

好问题,+1。关于这个问题的完整解释和想要的解决方案,请参阅我的答案。次要问题:对于给定的ID,您不应该有多个元素(因此问题中的HTML实际上是无效的)。实际上,浏览器无论如何都会让你这么做,但如果你这么做了,你就错过了使用ID的唯一好处,那就是它们会发出“我是唯一的”(而类被设计用于非唯一的能指)。我喜欢这个答案。我没有考虑优先权问题(我只是假设了简单的从左到右的优先权)。@rlandster:“优先权”这个词可能会让人困惑。
//input[@id='search\u query'][2]
的未加修饰的形式是:
/degenerat或self::node()/child::input[attribute::id='search\u query'][position()=2]
对于那些从Google来到这里的人来说,编号从第一个元素1开始,如此奇怪,在这些XPath查询中,这类数组以1开头,把我弄糊涂了。@Ivotje50是的,XPath序列和数组是1基的。谢谢你的回答。在我的例子中,接受的解决方案不起作用,因为我在robot框架中使用xpath,它不接受以括号开头的路径。然而,这一个应该可以做到