1

考虑这个简单的例子

library(xml2)

x <- read_xml("<body>
  <p>Some <b>text</b>.</p>
  <p>Some <b>other</b> <b>text</b>.</p>
  <p>No bold here!</p>
</body>")

现在,我想找到包含字符串的节点的所有父节点other 为此,我运行

> xml_find_all(x, "//b[contains(.,'other')]//parent::*")

{xml_nodeset (2)}
[1] <p>Some <b>other</b> <b>text</b>.</p>
[2] <b>other</b>

我不明白为什么我也得到了<b>other</b>元素。在我看来,只有一个父节点,即第一个节点。

这是一个错误吗?

4

1 回答 1

2

改变

//b[contains(.,'other')]//parent::*

选择descendant-or-self(你不想要self)和parent

//b[contains(.,'other')]/parent::*

纯粹沿着parent选择,从选择中消除<b>other</b>

或者,更好的是,使用这个 XPath:

//p[b[contains(.,'other')]]

如果您想选择所有具有其字符串值包含“其他”子字符串p的子元素的元素,或者b

//p[b = 'other']

ifb的字符串值应该等于 other。另请参阅contains() 在 XPath 中的作用是什么?

于 2018-02-08T16:07:53.987 回答