С R xml2 и purrr, как добавить последовательность атрибутов id вместе в группе? - PullRequest
1 голос
/ 12 апреля 2019

У меня есть XML-файл, который выглядит следующим образом:

library(tidyverse)
library(xml2)

x <- read_xml('<root>
                <group id= "1">
                  <subgroup>bla</subgroup>
                  <subgroup>bla2</subgroup>
                  <subgroup>bla3</subgroup>
                </group>
                <group id="2">
                  <subgroup>qsdfbla</subgroup>
                  <subgroup>bla2qsdf</subgroup>
                  <subgroup>bla3qfsd</subgroup>
                  <subgroup>qsdfqfsd</subgroup>
                </group>
              </root>')

Я хотел бы добавить атрибут id ко всем узлам подгруппы, которые следуют внутри каждой группы. Я хочу, чтобы первое значение было 1, затем 2, затем 3, а затем снова начните с 1 во второй группе.

Я пробовал это:

x %>%
  xml_find_all('//group') %>%
  map(~xml_children(.) %>% xml_set_attr("idSubGroup",seq_along(.)))

но все, что мне удается сделать, это поставить 1 в каждом атрибуте idSubGroup. Как я мог на самом деле "Seq вдоль"?

1 Ответ

1 голос
/ 12 апреля 2019

Вот решение, которое в основном представляет собой цикл внутри цикла.Найдите узлы группы, затем один за другим найдите дочерние узлы и обновите каждый из них в отдельности.Я не верю, что этот шаг можно векторизовать.
Я использовал здесь функции lapply и sapply, но при желании мог бы быть преобразован в пакет purrr.

library(xml2)
library(tidyverse)

x <- read_xml('<root>
              <group id= "1">
              <subgroup>bla</subgroup>
              <subgroup>bla2</subgroup>
              <subgroup>bla3</subgroup>
              </group>
              <group id="2">
              <subgroup>qsdfbla</subgroup>
              <subgroup>bla2qsdf</subgroup>
              <subgroup>bla3qfsd</subgroup>
              <subgroup>qsdfqfsd</subgroup>
              </group>
              </root>')


#find all of the group nodes
groups<-x %>%   xml_find_all('//group')

lapply(groups, function(group){
   #find all of the children nodes in each group
   cnodes<-group %>% xml_children(.)
   #loop through each child node and add subgroup number
   sapply(1:length(cnodes), function(node){cnodes[node] %>% xml_set_attr("idSubGroup",node) })
})

print(x)
# {xml_document}
# <root>
# [1] <group id="1">\n  <subgroup idSubGroup="1">bla</subgroup>\n  <subgroup idSubGroup="2">bla2</subgroup>\n  < ...
# [2] <group id="2">\n  <subgroup idSubGroup="1">qsdfbla</subgroup>\n  <subgroup idSubGroup="2">bla2qsdf</subgro ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...