Как я могу извлечь строки из определенного узла, только если за ним следует определенный дочерний узел в R?

#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"