将具有重复节点的 XML 转换为 R 数据框
Posted
技术标签:
【中文标题】将具有重复节点的 XML 转换为 R 数据框【英文标题】:Convert XML with repeated nodes to R data frame 【发布时间】:2015-07-28 12:59:08 【问题描述】:我正在尝试将具有相同名称(但由属性值唯一标识)的重复节点的 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)。
任何帮助将不胜感激......
【问题讨论】:
【参考方案1】:您可能需要为每个节点创建一个 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
【讨论】:
以上是关于将具有重复节点的 XML 转换为 R 数据框的主要内容,如果未能解决你的问题,请参考以下文章