【问题标题】:XPath query to get nth instance of an elementXPath 查询以获取元素的第 n 个实例
【发布时间】:2011-04-29 18:36:54
【问题描述】:

有一个 HTML 文件(其内容不受我控制)具有多个 input 元素,它们都具有相同的固定 id 属性 "search_query"。文件的内容可以改变,但我知道我总是想得到第二个input id 属性为"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 属性为"search_query"input 元素)。

什么是正确的 XPath 表达式?

【问题讨论】:

  • 好问题,+1。有关问题的完整解释和想要的解决方案,请参阅我的答案。
  • 次要点:您永远不应该拥有多个具有给定 ID 的元素(因此问题中的 HTML 实际上是无效的)。实际上,浏览器无论如何都会让你这样做,但如果你这样做了,你就会错过使用 ID 的唯一好处,那就是它们表明“我是独一无二的”(而类被设计用于非唯一能指)。
  • 不是小问题@machineghost!它实际上是一个错误! ID代表唯一标识符!

标签: xml xpath


【解决方案1】:

这似乎有效:

/descendant::input[@id="search_query"][2]

我从 Michael Kay 的“XSLT 2.0 和 XPath 2.0 程序员参考,第 4 版”开始。

XML 路径语言规范http://www.w3.org/TR/xpath/#path-abbrev 的“缩写语法”部分中还有一条注释提供了线索。

【讨论】:

  • 非常感谢您的回答。在我的情况下,接受的解决方案不起作用,因为我在机器人框架中使用 xpath,它不接受以括号开头的路径。然而,这个应该可以解决问题
  • 当我尝试这个时:${el_my_value}= XML.Get Element ${x} .//isbn
  • 它导致:找到匹配'.//isbn'的多个元素(6)。我怎样才能找到第四个?
【解决方案2】:

这是一个常见问题解答

//somexpression[$N]

表示“查找//somexpression 选择的每个节点,它是其父节点的$Nth 子节点”。

你想要的是

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

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

【讨论】:

  • 我喜欢这个答案。我没有考虑优先级问题(我只是假设简单的从左到右的优先级)。
  • @rlandster:“优先级”这个词可能令人困惑。 //input[@id='search_query'][2] 的未缩写形式为:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]
  • 对于那些从谷歌来到这里的人 - 编号从 1 开始 - [1] 是第一个元素,依此类推
  • 奇怪的是,在这些 XPath 查询中,这些类型的数组以 1 开头,让我很困惑。
  • @Ivotje50 是的 XPath 序列和数组是基于 1 的
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 2022-08-17
  • 1970-01-01
  • 2014-12-27
  • 2010-10-16
  • 2021-10-07
  • 2011-08-03
  • 2021-09-21
相关资源
最近更新 更多