2015-05-16 2 views
1

Я пытаюсь сгладить XML с повторяющимися узлами одного и того же имени (но однозначно идентифицируется значением атрибута) до плоских данных в R. Например, я имеюПреобразование XML с повторяющимися узлами в кадре данных R

<?xml version="1.0"?> 
<data> 
<tr id="1"> 
    <A id="100">100</A> 
    <B>abc</B> 
    <C>true</C> 
</tr> 
<tr id="2"> 
    <A id="200">200</A> 
    <A id="300">300</A> 
    <B>wxyz</B> 
    <C>FALSE</C> 
</tr> 
</data> 

желаемый результат является data.frame, который будет выглядеть

tr  A  B  C 
1 100 abc true 
2 200 wxyz FALSE 
2 300 wxyz FALSE 

Я прочитал XML ...

library(XML) 
xmlfile <- "H:/My Documents/Code/R/xml/example.xml" 
xmldoc <- xmlTreeParse(xmlfile) 

Использование xpathSApply(), я могу получить каждый узел и атрибут без проблем, например,

data.frame(id = xpathSApply(xmldoc, "//A", xmlGetAttr, "id")) 

, но я не организовать всю партию в data.frame, так как число «А» узлов больше (3), чем число всех остальных узлов (2).

Любая помощь будет принята с благодарностью ...

ответ

0

Вы, вероятно, нужно создать data.frame для каждого узла и объединить результаты.

tr <- getNodeSet(xmldoc, "//tr") 
x <- lapply(tr, function(x) data.frame(tr = xpathSApply(x, "." , xmlGetAttr, "id"), 
             A = xpathSApply(x, ".//A", xmlValue), 
             B = xpathSApply(x, ".//B", xmlValue), 
             C = xpathSApply(x, ".//C", xmlValue))) 

do.call("rbind", x) 
    tr A B  C 
1 1 100 abc true 
2 2 200 wxyz FALSE 
3 2 300 wxyz FALSE 
Смежные вопросы