考虑这个简单的例子
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
?
谢谢!
答案 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。