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