考虑这个简单的例子

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,以了解有关wortext()之间区别的更多信息。简而言之,如果元素的字符串值包含.,则[contains(., "wor")]返回true。

关于r - 使用正则表达式与xml2?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48673776/

10-09 05:28