我有一个非常复杂的 xml 文件需要在 R 中以数据帧格式解析和呈现。结构可能类似于以下示例。节点不平行。
<Root>
<A>
<info1>a</info1>
<child>
<info2>b</info2>
<info3>c</info3>
<info4>d</info4>
</child>
<info5>e</info5>
</A>
<B>
<info6>f</info6>
<info7>g</info7>
</B>
</Root>
我想出了一些代码来解析文件:
doc <- xmlParse(file="sample.xml", useInternal = TRUE)
rootnode <- xmlRoot(doc)
df1<-xmlToDataFrame(nodes=getNodeSet(rootnode, "//Root/A"))
df2<-xmlToDataFrame(nodes=getNodeSet(rootnode, "//Root/B"))
Final<-cbind.data.frame(df1,df2, all=TRUE)
返回的结果为:(所有值表单节点都收缩在一起)
info1 child info5 info6 info7
a bcd e f g
然而,我想要的理想结果是:
info1 info2 info3 info4 info5 info6 info7
a b c d e f g
由于类似上述情况的xml文件中存在大量节点,手动操作dataframe并不明智。
我也尝试把路径语句改成“//Root/A/child”,那么节点A和节点B下的所有值都会丢失。
有没有人可以提供解决这个问题的方法。提前致谢。
最佳答案
可以尝试使用 xmlToList
和 unlist
来减少命名矢量格式的 xml
数据。可以使用 gsub
更改名称以符合 OP 的期望:
library(XML)
result <- unlist(xmlToList(xmlParse(xml)))
#Change the name to refer only child
names(result) <- gsub(".*\\.(\\w+)$","\\1", names(result))
result
# info1 info2 info3 info4 info5 info6 info7
# "a" "b" "c" "d" "e" "f" "g"
数据:
xml <- "<Root>
<A>
<info1>a</info1>
<child>
<info2>b</info2>
<info3>c</info3>
<info4>d</info4>
</child>
<info5>e</info5>
</A>
<B>
<info6>f</info6>
<info7>g</info7>
</B>
</Root>"
关于R:解析大型非结构化 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50142628/