2015-05-16 41 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,因爲「A」的節點數量較大( 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