将正则表达式与 xml2 一起使用?

using regex with xml2?

考虑这个简单的例子

example_xml <- '<?xml version="1.0" encoding="UTF-8"?>
<file>
<book>
<text>abracadabra</text>
<node></node>
</book>
<book>
<text>hello world</text>
<node></node>
</book>
</file>'

myxml <- xml2::read_xml(example_xml)

现在,运行 这按预期工作了

> myxml %>% xml_find_all('//book')
{xml_nodeset (2)}
[1] <book>\n  <text>abracadabra</text>\n  <node/>\n</book>
[2] <book>\n  <text>hello world</text>\n  <node/>\n</book>

但查找 text 属性包含 wor 的节点不会。

> myxml %>% xml_find_all('//book[contains(@text, "wor")]')
{xml_nodeset (0)}

这里有什么问题?如何将正则表达式(或部分字符串匹配)与 xml2 一起使用?

谢谢!

//book[contains(@text, "wor")] XPath 找到 book 个包含 text 属性(@ 指定属性)的节点,这些节点的值中包含 wor

您的 XML 不包含 <book text="Hello world">Title</book> 等元素,因此没有结果。

您可以使用

获取文本节点中包含wor的书籍节点
> xml_find_all(myxml, '//book[contains(., "wor")]')
{xml_nodeset (1)}
[1] <book>\n  <text>hello world</text>\n  <node/>\n</book>

如果您只使用 text 个节点作为 return 值,您可以使用

> xml_find_all(myxml, '//book/text[contains(., "wor")]')
{xml_nodeset (1)}
[1] <text>hello world</text>

如果您需要获取所有 book 个父节点,其中包含任何带有 wor 文本的子节点,请使用

> xml_find_all(myxml, '//*[contains(., "wor")]/parent::book')
{xml_nodeset (1)}
[1] <book>\n  <text>hello world</text>\n  <node/>\n</book>

请参阅 以了解有关 text(). 之间区别的更多信息。简而言之,如果元素的字符串值包含 wor.

,则 [contains(., "wor")] return 为真