#r
#r
Вопрос:
Как я могу извлечь строки в «исходных» узлах, только если они предшествуют узлу «тома»?
xml <- "<doc>
<head>
<volume>1</volume>
</head>
<ref id='1'>
<source>a</source>
<volume>114</volume>
</ref>
<ref id='2'>
<source>b</source>
<issue>2</issue>
</ref>
<ref id='3'>
<source>c</source>
<volume>166</volume>
</ref>
<ref id='4'>
<source>d</source>
<volume>19</volume>
</ref>
</doc>"
По сути, я хочу получить следующий вывод: a, c, d
Комментарии:
1. Используете ли вы
XML
илиxml2
для анализа xml? Решения могут отличаться в зависимости от того, какой из них вы используете.2. до сих пор я использовал XML, но я изучал xml2
3. Я могу прокомментировать только xml2, но я подозреваю, что процесс будет похож на что-то подобное. То, что вы ищете, — это оси xpath , поэтому что-то, что может сработать, будет похоже на xml_text(xml, xpath=»//volume/previous-sibling::source»)
4. Я получаю эту ошибку » Ошибка в xml_text(xml, xpath = «// volume/ previous-sibling::source»): неиспользуемый аргумент (xpath = «// volume/ previous-sibling::source») »
5. Это сработало для меня » getNodeSet(xml, path=»//volume/previous-sibling::source») «! Спасибо, что поделились осями xpath, я новичок в xml.
Ответ №1:
Я отредактировал ваш пример XML, чтобы сделать его более достоверным (включив корень документа и указав значения атрибутов).
Затем:
library(xml2)
library(magrittr) # for pipes %>%
read_xml(xml) %>%
xml_find_all(xpath = "//volume/preceding-sibling::source") %>%
xml_text()
[1] "a" "c" "d"