2

考虑这个简单的例子

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

谢谢!

4

1 回答 1

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>

请参阅此答案text()以了解有关和之间区别的更多信息.。简而言之,[contains(., "wor")]如果元素的字符串值包含 ,则返回 true wor

于 2018-02-07T22:02:37.083 回答