在Win7中使用R(3.0.1)
我一直在尝试将xml文件(下面的示例)转换为数据框,并且一直在努力。我已经阅读了SO上的一些链接,并找到了一些有用的东西,让我开始使用包xmlTreeParse
中的xmlToDataFrame
和XML
,并尝试了一些建议。但是,我甚至无法接近能够做到这一点。我的主要限制是我对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