将正则表达式与 xml2 一起使用?
using regex with 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
一起使用?
谢谢!
//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
个节点作为 return 值,您可以使用
> 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()
和 .
之间区别的更多信息。简而言之,如果元素的字符串值包含 wor
.
,则 [contains(., "wor")]
return 为真
考虑这个简单的例子
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
属性(@
指定属性)的节点,这些节点的值中包含 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
个节点作为 return 值,您可以使用
> 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()
和 .
之间区别的更多信息。简而言之,如果元素的字符串值包含 wor
.
[contains(., "wor")]
return 为真