考虑这个简单的例子
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
指定属性)的@
节点。
您的XML不包含wor
之类的元素,因此没有结果。
您可以使用以下命令在其文本节点中包含<book text="Hello world">Title</book>
的书节点
> xml_find_all(myxml, '//book[contains(., "wor")]')
{xml_nodeset (1)}
[1] <book>\n <text>hello world</text>\n <node/>\n</book>
如果只使用
wor
个节点作为返回值,则可以使用> xml_find_all(myxml, '//book/text[contains(., "wor")]')
{xml_nodeset (1)}
[1] <text>hello world</text>
如果需要获取所有
text
父级,其中包含带有book
文本的所有子节点,请使用> xml_find_all(myxml, '//*[contains(., "wor")]/parent::book')
{xml_nodeset (1)}
[1] <book>\n <text>hello world</text>\n <node/>\n</book>
请参见this answer,以了解有关
wor
和text()
之间区别的更多信息。简而言之,如果元素的字符串值包含.
,则[contains(., "wor")]
返回true。关于r - 使用正则表达式与xml2?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48673776/