将XML文件转换为R中的数据框

时间:2014-03-17 20:38:38

标签: xml r dataframe

在Win7中使用R(3.0.1)

我一直在尝试将xml文件(下面的示例)转换为数据框,并且一直在努力。我已经阅读了SO上的一些链接,并找到了一些有用的东西,让我开始使用包xmlTreeParse中的xmlToDataFrameXML,并尝试了一些建议。但是,我甚至无法接近能够做到这一点。我的主要限制是我对XML文件知之甚少。我已经阅读了一些xml结构的基础知识,但这似乎并不是一个简单的格式。

寻找任何人可能提供的任何帮助或建议。

XML文件确实在excel中打开而没有干预,但遗憾的是我需要能够读取数百个这样的内容,因此在将R解析之前从excel保存到.csv并不是一个真正的选项。

XML文件的示例部分:

<?xml version="1.0" encoding="UTF-8"?>
<bulkCmConfigDataFile xmlns:es="SpecificAttributes.13.06.xsd"
    xmlns:un="utranNrm.xsd" xmlns:xn="genericNrm.xsd"
    xmlns:gn="geranNrm.xsd" xmlns="configData.xsd">
<fileHeader fileFormatVersion="32.615 V4.5" vendorName=""/>
<configData dnPrefix="Undefined">
    <xn:SubNetwork id="ONRM_ROOT_MO_R">
        <xn:SubNetwork id="NC_CLIN">
            <xn:MeContext id="testsite1">
                <xn:ManagedElement id="1">
                    <xn:VsDataContainer id="1">
                        <xn:attributes>
                            <xn:vsDataType>vsDataSystemFunctions</xn:vsDataType>
                            <xn:vsDataFormatVersion>SpecificAttributes.13.06</xn:vsDataFormatVersion>
                            <es:vsDataSystemFunctions/>
                        </xn:attributes>
                        <xn:VsDataContainer id="1">
                            <xn:attributes>
                                <xn:vsDataType>vsDataLicensing</xn:vsDataType>
                                <xn:vsDataFormatVersion>SpecificAttributes.13.06</xn:vsDataFormatVersion>
                                <es:vsDataLicensing/>
                            </xn:attributes>
                            <xn:VsDataContainer id="1">
                                <xn:attributes>
                                <xn:vsDataType>vsDataCapacityLicenses</xn:vsDataType>
                                <xn:vsDataFormatVersion>SpecificAttributes.13.06</xn:vsDataFormatVersion>
                                <es:vsDataCapacityLicenses/>
                                </xn:attributes>
                                <xn:VsDataContainer id="1">
                                <xn:attributes>
                                <xn:vsDataType>vsDataCapacityConnectedUsers</xn:vsDataType>
                                <xn:vsDataFormatVersion>SpecificAttributes.13.06</xn:vsDataFormatVersion>
                                <es:vsDataCapacityConnectedUsers>
                                <es:licenseCapacityConnectedUsers>150</es:licenseCapacityConnectedUsers>
                                <es:licenseStateConnectedUsers>1</es:licenseStateConnectedUsers>
                                <es:capacityUnitConnectedUsers>Number of Connected Users</es:capacityUnitConnectedUsers>
                                <es:keyIdConnectedUsers>CXC4010608</es:keyIdConnectedUsers>
                                <es:licConnectedUsersPercentileConf>90</es:licConnectedUsersPercentileConf>
                                <es:gracePeriodActive>false</es:gracePeriodActive>
                                <es:gracePeriodAvailable>true</es:gracePeriodAvailable>
                                <es:gracePeriodOriginalLicenseLimit>75</es:gracePeriodOriginalLicenseLimit>
                                <es:gracePeriodTimeLeft>146</es:gracePeriodTimeLeft>
                                </es:vsDataCapacityConnectedUsers>
                                </xn:attributes>
                                </xn:VsDataContainer>
                            </xn:VsDataContainer>
                        </xn:VsDataContainer>
                    </xn:VsDataContainer>
                </xn:ManagedElement>
            </xn:MeContext>
            <xn:MeContext id="testsite2">
                <xn:ManagedElement id="1">
                    <xn:VsDataContainer id="1">
                        <xn:attributes>
                            <xn:vsDataType>vsDataSystemFunctions</xn:vsDataType>
                            <xn:vsDataFormatVersion>SpecificAttributes.13.06</xn:vsDataFormatVersion>
                            <es:vsDataSystemFunctions/>
                        </xn:attributes>
                        <xn:VsDataContainer id="1">
                            <xn:attributes>
                                <xn:vsDataType>vsDataLicensing</xn:vsDataType>
                                <xn:vsDataFormatVersion>SpecificAttributes.13.06</xn:vsDataFormatVersion>
                                <es:vsDataLicensing/>
                            </xn:attributes>
                            <xn:VsDataContainer id="1">
                                <xn:attributes>
                                <xn:vsDataType>vsDataCapacityLicenses</xn:vsDataType>
                                <xn:vsDataFormatVersion>SpecificAttributes.13.06</xn:vsDataFormatVersion>
                                <es:vsDataCapacityLicenses/>
                                </xn:attributes>
                                <xn:VsDataContainer id="1">
                                <xn:attributes>
                                <xn:vsDataType>vsDataCapacityConnectedUsers</xn:vsDataType>
                                <xn:vsDataFormatVersion>SpecificAttributes.13.06</xn:vsDataFormatVersion>
                                <es:vsDataCapacityConnectedUsers>
                                <es:licenseCapacityConnectedUsers>200</es:licenseCapacityConnectedUsers>
                                <es:licenseStateConnectedUsers>1</es:licenseStateConnectedUsers>
                                <es:capacityUnitConnectedUsers>Number of Connected Users</es:capacityUnitConnectedUsers>
                                <es:keyIdConnectedUsers>CXC4010608</es:keyIdConnectedUsers>
                                <es:licConnectedUsersPercentileConf>90</es:licConnectedUsersPercentileConf>
                                <es:gracePeriodActive>false</es:gracePeriodActive>
                                <es:gracePeriodAvailable>true</es:gracePeriodAvailable>
                                <es:gracePeriodOriginalLicenseLimit>0</es:gracePeriodOriginalLicenseLimit>
                                <es:gracePeriodTimeLeft>0</es:gracePeriodTimeLeft>
                                </es:vsDataCapacityConnectedUsers>
                                </xn:attributes>
                                </xn:VsDataContainer>
                            </xn:VsDataContainer>
                        </xn:VsDataContainer>
                    </xn:VsDataContainer>
                </xn:ManagedElement>
            </xn:MeContext>
        </xn:SubNetwork>
    </xn:SubNetwork>
</configData>
<fileFooter dateTime="2014-03-17T06:00:19Z"/>
</bulkCmConfigDataFile>

更新:

所以我仍然希望找到使用包XML执行此操作的正确方法,但是现在我使用read.csv将xml文件中的所有行读入R.然后使用简单的for循环拉出我感兴趣的最重要的部分。

test<-read.csv("C:/TEMP/file.xml")

parsedXML<-data.frame("SITE"=seq(0,100000, 1), "DATE"=-9999, "GPACTIVE"=-9999, "GPLEFT"=-9999)
parsedXML$ENODEB<--9999

row=0

for (i in 1:length(test[,1]))
  { 


    if(test[i,1]=="                </xn:MeContext>")
    {
      row=row+1
      i=i+1
      parsedXML$SITE[row]<-substr(test[i,1], 34, nchar(as.character(test[i,1]))-1)

      i=i+30
      parsedXML$GPACTIVE[row]<-substr(test[i,1], 59, nchar(as.character(test[i,1]))-23)

      i=i+3
      parsedXML$GPLEFT[row]<-substr(test[i,1], 61, nchar(as.character(test[i,1]))-25)

    }

  }

parsedXML$DATE<-substr(test[length(test[,1])-1,], 26, 44)## fill in the date of the file

parsedXMLfinal<-parsedXML[parsedXML$ENODEB!=-9999,]## remove unused rows

parsedXMLfinal2<-parsedXMLfinal[parsedXMLfinal$ENODEB!="",]## remove any blanks

它无论如何都不优雅,但却为我提供了类似的东西:

ENODEB     DATE                   GPACTIVE   GPLEFT
testsite1  2014-03-17T06:00:19Z   false      146
testsite2  2014-03-17T06:00:19Z   false      0

0 个答案:

没有答案