2015-10-27 38 views
3

我试图将XML解析为R数据帧。如何将复杂的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]) 

我得到它只能用一条记录工作。结果是它创建了一个有两列的表格(dateTime字段)并且只有一行。下面标签之间的所有文字结合在一起:

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

由于日期时间是因为它是需要得到一个长格式表的结构,因为这两个领域的结构:

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 
... 

回答

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 
+0

感谢。它正在为一个记录集工作。但是对于更多设置xmlout只会给出一个结果。我正在编辑我的问题以添加一个记录集。 – juanmah

+0

@ juanmah看到编辑,它现在应该工作 – jeremycg

+0

是的,它的工作原理。非常感谢 – juanmah