【问题标题】:Convert XML with repeated nodes to R data frame将具有重复节点的 XML 转换为 R 数据框
【发布时间】: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)。

任何帮助将不胜感激......

【问题讨论】:

    标签: xml r dataframe flatten


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2023-01-03
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      相关资源
      最近更新 更多