С помощью регулярных выражений с 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?

Спасибо!

1 ответ

Решение

//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,

Другие вопросы по тегам