Я пытаюсь преобразовать данные из XML в табличную форму. Я борюсь с элементами с дочерями. Вот пример:
library(xml2)
library(data.table)
doc =
"<doc>
<rec>
<name> John </name>
<address>
<street> 2nd Av </street>
<number> 1036 </number>
</address>
<hobbies>
<hobby> tennis </hobby>
<hobby> gardening </hobby>
</hobbies>
</rec>
<rec>
<name> Mary </name>
<address>
<street>55th St</street>
<number> 132 </number>
</address>
<hobbies>
<hobby> running </hobby>
</hobbies>
</rec>
</doc>
"
# read in
pg <- read_xml(doc)
# make a list of records
recs = xml_find_all(pg, "//rec", xml_ns(pg))
# function to loop over list
extractRecord = function(x) {
txt = xml_text(xml_children(x))
name = xml_name(xml_children(x))
names(txt) = name
dt = setDT(as.list(txt))[]
return(dt)
}
# loop over list of records
lst = lapply(recs, extractRecord)
# bind elements do a data table
dt = rbindlist(lst, use.names = T, fill = T); dt
> name address hobbies
> 1: John 2nd Av 1036 tennis gardening
> 2: Mary 55th St 132 running
Это работает как шарм, за исключением того, что я хотел бы иметь:
- два столбца для адреса, по одному для каждого подэлемента, например, address.street и address.number.
- две колонки для увлечений - скажем, хобби1 и хобби2. Важно отметить, что количество дочерних детей может варьироваться.
В конце концов, у меня было бы что-то вроде
Я также хотел бы придерживаться пакета xml2
, если это возможно (потому что у меня много файлов большого размера, а пакет XML
имеет известные проблемы с памятью, которые становятся проблемой в моем случае).