如何在R中将复杂的XML解析为长格式数据框

3

我尝试将XML解析为R数据框。

xml.text <- 
  '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recordGroup>
    <period>60</period>
    <record>
        <dateTime>01102015000000</dateTime>
        <field>
            <id>Equipos.0CR02-1.AE</id>
            <value>34.405000</value>
        </field>
        <field>
            <id>Equipos.0CR02-1.API</id>
            <value>160.794000</value>
        </field>
    </record>
    <record>
        <dateTime>01102015001500</dateTime>
    <field>
      <id>Equipos.0CR02-1.AE</id>
      <value>38.309000</value>
    </field>
    <field>
      <id>Equipos.0CR02-1.API</id>
      <value>152.800000</value>
    </field>
  </record>
</recordGroup>'

library(XML)
xml <- xmlParse(xml.text)
indata <- xmlToDataFrame(getNodeSet(xml, "//recordGroup/record")[1])

我只能让它处理单条记录,结果是创建了一个包含两列(dateTimefield)且仅有一行的表格。在field标签之间的所有文本都被合并在一起:

    dateTime                                                      field
1 01102015000000 Equipos.0CR02-1.AE34.405000\nEquipos.0CR02-1.API160.794000

由于dateTime适用于两个字段结构,因此需要获取长格式表结构,如下所示:

    dateTime            id               value
1 01102015000000 Equipos.0CR02-1.AE    34.405000
2 01102015000000 Equipos.0CR02-1.API  160.794000
3 01102015001500 Equipos.0CR02-1.AE    38.309000
4 01102015001500 Equipos.0CR02-1.API  152.800000
...
1个回答

3

您的XML有点混乱,但我们可以修复它:

library(XML)
xml <- xmlParse(xml.text)
xmlout <- do.call(rbind, xpathApply(xml,'//recordGroup/record', xmlToDataFrame))

这使您可以:

            text                  id      value
1 01102015000000                <NA>       <NA>
2           <NA>  Equipos.0CR02-1.AE  34.405000
3           <NA> Equipos.0CR02-1.API 160.794000
4 01102015001500                <NA>       <NA>
5           <NA>  Equipos.0CR02-1.AE  38.309000
6           <NA> Equipos.0CR02-1.API 152.800000

您可以使用tidyrdplyr来清理数据:

library(tidyr)
library(dplyr)

xmlout %>% fill(text) %>%
           na.omit

            text                  id      value
2 01102015000000  Equipos.0CR02-1.AE  34.405000
3 01102015000000 Equipos.0CR02-1.API 160.794000
5 01102015001500  Equipos.0CR02-1.AE  38.309000
6 01102015001500 Equipos.0CR02-1.API 152.800000

谢谢。它可以处理一个记录集。但是对于更多的记录集,xmlout只会给出一个结果。我正在编辑我的问题以添加一个记录集。 - juanmah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接