2016-03-15 51 views
-1

我想使用R解析XML文件为CSV。我正在使用XML库来执行此操作。请找到下面的代码使用R解析XML文件中的问题

library(XML) 
a<-xmlParse(file.choose()) 
library(plyr) 
ldply(xmlToList(a), function(x) { data.frame(x[!names(x)==""]) }) 

样本数据下面

<SSE xmlns="urn:com:ssn:schema:export:v2.0:SSNExportFormat.xsd" Version="2.0" DocumentID="aebjjjjd-59de-4405-ac0b-50e33b0b4f4b-1" JobID="3354" ExportID="aeb5bf7d-59de-4405-er0b-50e33b0b4f4b" RunID="20430452"  CreationTime="2015-12-21T13:55:00.807-05:00" StartTime="2015-12-21T09:55:00.000- 05:00" EndTime="2015-12-21T13:55:00.000-05:00"> 

    <IRD NumberINTVs="3" EndTime="2015-12-21T12:00:00.000-05:00" StartTime="2015- 12-21T09:00:00.000-05:00" INTVLength="60"> 
    <INTV GatewayCollectedTime="2015-12-21T12:05:02.257-05:00"        INTVSequenceNumber="47112" BlockSequenceNumber="0" EndTime="2015-12-21T10:00:00.000-05:00"> 
     <INTVStatus>SERV_HST</INTVStatus> 
     <RD U="kWh" BEV="0.0379" Val="0" RV="0" port="1"/> 
     <RD U="kWh" BEV="0.0379" Val="0" RV="0" port="2"/> 
     <RD U="Vrms" BEV="231.0000" Val="231.0000" RV="231" port="3"/> 
    </INTV> 
     <INTV GatewayCollectedTime="2015-12-21T12:05:02.257-05:00"  INTVSequenceNumber="47113" BlockSequenceNumber="0" EndTime="2015-12-21T11:00:00.000-05:00"> 
      <INTVStatus>SERV_HST</INTVStatus> 
     <RD U="kWh" BEV="0.0379" Val="0" RV="0" port="1"/> 
     <RD U="kWh" BEV="0.0379" Val="0" RV="0" port="2"/> 
     <RD U="Vrms" BEV="231.0000" Val="231.0000" RV="231" port="3"/> 
      </INTV> 
      <INTV GatewayCollectedTime="2015-12-21T12:05:02.257-05:00"                     INTVSequenceNumber="47114" BlockSequenceNumber="0" EndTime="2015-12- 21T12:00:00.000-05:00"> 
      <INTVStatus>SERV_HST</INTVStatus> 
      <RD U="kWh" BEV="0.0379" Val="0" RV="0" port="1"/> 
      <RD U="kWh" BEV="0.0379" Val="0" RV="0" port="2"/> 
      <RD U="Vrms" BEV="231.0000" Val="231.0000" RV="231" port="3"/> 
    </INTV> 
</IRD> 

问题是上面跑

回答

1

的代码时,我没有看到任何输出,该文件的主要问题是您有一个未声明的名称空间,并具有多个相关数据级别(即XML的树性质)。因此,xmlToList()可能无法正常工作,因为您需要查看各个节点。

考虑拉个别节点集并将列表绑定到数据框。下面声明了手动命名空间ns。复制rep()用于父节点对应于每个子节点。

library(XML) 

a<-xmlParse(file.choose()) 

# EXTRACT NODE SETS 
INTV <- getNodeSet(a, '//ns:INTV', 
        c(ns="urn:com:ssn:schema:export:v2.0:SSNExportFormat.xsd"), xmlAttrs) 
INTVStatus <- getNodeSet(a, '//ns:INTVStatus', 
        c(ns="urn:com:ssn:schema:export:v2.0:SSNExportFormat.xsd"), xmlValue) 
RD <- getNodeSet(a, '//ns:RD', 
        c(ns="urn:com:ssn:schema:export:v2.0:SSNExportFormat.xsd"), xmlAttrs) 

# COMBINE LISTS INTO DATA FRAME 
df <- data.frame(do.call(rbind, rep(INTV,3)), 
       INTVStatus = unlist(rep(INTVStatus,3)), 
       do.call(rbind, RD)) 

write.csv(df, 'Output.csv') 
#  GatewayCollectedTime INTVSequenceNumber BlockSequenceNumber    EndTime  INTVStatus  U   BEV  Val  RV  port 
#1  2015-12-21T12:05:02.257-05:00  47112  0  2015-12-21T10:00:00.000-05:00  SERV_HST  kWh  0.0379  0  0  1 
#2  2015-12-21T12:05:02.257-05:00  47113  0  2015-12-21T11:00:00.000-05:00  SERV_HST  kWh  0.0379  0  0  2 
#3  2015-12-21T12:05:02.257-05:00  47114  0  2015-12-21T12:00:00.000-05:00  SERV_HST  Vrms 231.0000  231  231  3 
#4  2015-12-21T12:05:02.257-05:00  47112  0  2015-12-21T10:00:00.000-05:00  SERV_HST  kWh  0.0379  0  0  1 
#5  2015-12-21T12:05:02.257-05:00  47113  0  2015-12-21T11:00:00.000-05:00  SERV_HST  kWh  0.0379  0  0  2 
#6  2015-12-21T12:05:02.257-05:00  47114  0  2015-12-21T12:00:00.000-05:00  SERV_HST  Vrms 231.0000  231  231  3 
#7  2015-12-21T12:05:02.257-05:00  47112  0  2015-12-21T10:00:00.000-05:00  SERV_HST  kWh  0.0379  0  0  1 
#8  2015-12-21T12:05:02.257-05:00  47113  0  2015-12-21T11:00:00.000-05:00  SERV_HST  kWh  0.0379  0  0  2 
#9  2015-12-21T12:05:02.257-05:00  47114  0  2015-12-21T12:00:00.000-05:00  SERV_HST  Vrms 231.0000  231  231  3