将具有重复节点的 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 数据框的主要内容,如果未能解决你的问题,请参考以下文章

java将字符串转换为xml并解析节点[重复]

如何在QT中将xml节点数据转换为字符串[重复]

具有相同级别下重复节点的 XSLT 变换

如何根据条件从 XML 中删除节点?

将 xml 中的节点与 xslt 进行比较

将所有子兄弟节点转换为类父节点