使用正则表达式与xml2?

时间:2018-02-07 21:45:12

标签: r regex xpath 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

一起使用

谢谢!

1 个答案:

答案 0 :(得分:2)

//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个节点作为返回值,则可以使用

> 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>

请参阅this answer,详细了解text().之间的区别。简而言之,如果元素的字符串值包含[contains(., "wor")],则wor返回true。