Вот решение с использованием пакета «xml2». Я написал эту функцию, чтобы найти клапан на каждом узле, но в вашем случае мы просто ищем атрибут «id» для каждого узла.
Цель состоит в том, чтобы найти все узлы верхнего уровня без дочерних элементов и извлечь их значения, затем перейти к узлам с дочерними элементами. Затем повторяйте эту функцию рекурсивно, пока не будут найдены и обработаны наибольшие узлы-потомки.
library(xml2)
file<-read_xml('<node id="A">
<node id = "AA">
<node id = "AAA"></node>
</node>
<node id = "AB">
</node>
<node id = "AC">
</node>
</node>')
findchildren<-function(nodes, df){
numchild<-sapply(nodes, function(x){length(xml_children(x))})
#extract out the attribute, value and parents
xmlattr<-xml_attr(nodes[numchild==0], "id")
#xmlvalue<-xml_text(nodes[numchild==0]) #value of node
xmlpath<-sapply(nodes[numchild==0], function(x) {toString(rev(xml_attr(xml_parents(x), "id")))})
#dftemp<-data.frame(xmlattr, xmlvalue, xmlpath)
dftemp<-data.frame(xmlpath, xmlattr)
#merge results back to master df
df<-rbind(df, dftemp)
print(dim(df)) #Print statement for status
#End of recursion
if (sum(numchild)>0){
findchildren(xml_children(nodes[numchild>0]), df) }
else{ return(df)}
}
df<-data.frame()
df<-findchildren(xml_children(file), df)
apply(df, 1, toString)
Эта функция выводит кадр данных из 2 столбцов. Первый столбец — это путь xml к узлу во втором столбце. Я использовал команду apply
, чтобы объединить эти 2 столбца вместе для вашего окончательного решения. Порядок в конечном списке основан не на исходной конструкции документа, а на перечислении родительских, затем дочерних, внуков узлов.... Эта функция повторно вызывает rbind
не самый эффективный метод, но приемлемый, если количество дочерних уровней не слишком велик.
Надеюсь, что это работает для вас.
person
Dave2e
schedule
08.07.2016
xml %>% read_xml() %>% xml_find_all('//*') %>% xml_path()
, но это не совсем то, что вы ожидаете. - person alistaire   schedule 07.07.2016