XML文件没有以期望的方式在R中写入

时间:2015-04-05 23:42:20

标签: xml r

我有点困惑我的代码。我的XML文件的子集正确写入csv。但是18MB大的实际文件并没有正确地写入csv。代码完全一样。我尝试了很多东西,但它只是不起作用。我在2天前问过另一个question并且已经提升到这一点。请帮忙。 我的代码:

doc<-xmlTreeParse("PrimaryCatchments.xml", options=HUGE)
top<-xmlRoot(doc)
extract <- xmlSApply(top, function(x) xmlSApply(x, xmlValue)) 
extract_df <- data.frame(t(extract),row.names=NULL)
my.df <- data.frame(lapply(extract_df, as.character), stringsAsFactors=FALSE)
write.csv(my.df,"Extract.csv", row.names=FALSE)

编辑:上面的代码写入数据子集 name,ExtendedData,三个不同列中的坐标。 但是,使用完整的大型XML文件,此代码会写入 地标,地标1,地标2 ......... Placemark1016 所以theres 1016列有数据。它的值也以"c("开头 如何让我的大型XML文件写入3列和1016行?

1 个答案:

答案 0 :(得分:1)

问题确实是xml文件的大小。但是,我可能有一个涉及多个步骤的解决方案。从本质上讲,您可以获取大型xml文件并将其切片为较小的片段(例如,10个100个Placemark元素)并让R迭代每个子集化的xml文件。

第1步:XSL脚本

要进行切片,您可以运行此XML转换样式表,xsl文件,在后续位置选择地标元素。

第一个100个地标

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
    <xsl:element name="kml">
<xsl:for-each select="(//Placemark)[100 &gt;= position()]"><xsl:copy-of select="."/></xsl:for-each>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

下一页101 - 200个地标

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
    <xsl:element name="kml">
        <xsl:for-each select="(//Placemark)[(200 &gt;= position()) and (101 &lt;= position())]"><xsl:copy-of select="."/></xsl:for-each>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

......等到1016个地标

第2步:XML转换

接下来,使用R,Python,PHP,VBA或其他语言使用上面这些单独的10个xsl文件转换大型xml。 R可能有一个xslt包(为此,我使用了Python&#39; lxml模块)。在您的代码中,每次转换后,分别保存每个较小的xml文件(每个大约1.5 MB):PrimaryCatchments_100.xml,PrimaryCatchments_200.xml等。每个文件看起来都像18 MB大版本,但只包含100个地标。

第3步:R XML PARSING

然后,让R提取每个较小的xml文件(考虑一个循环lapply函数)。

doc<-xmlTreeParse("PrimaryCatchments_100.xml", options=OLDSAX)
top<-xmlRoot(doc)
extract <- xmlSApply(top, function(x) xmlSApply(x, xmlValue)) 
extract_df <- data.frame(t(extract),row.names=NULL)
my.df <- data.frame(lapply(extract_df, as.character), stringsAsFactors=FALSE)
write.csv(my.df,"Extract_100.csv", row.names=FALSE)
...

第4步:R CSV附录

最后,使用R将所有10个csv提取文件附加在一起。请注意,Excel单元格的最大字符数为32,767,某些坐标为54,000+,这会强制csv的电子表格视图中的新单元格。

extract100df<-read.csv("Extract_100.csv")
extract200df<-read.csv("Extract_200.csv")
extract300df<-read.csv("Extract_300.csv")
extract400df<-read.csv("Extract_400.csv")
extract500df<-read.csv("Extract_500.csv")
extract600df<-read.csv("Extract_600.csv")
extract700df<-read.csv("Extract_700.csv")
extract800df<-read.csv("Extract_800.csv")
extract900df<-read.csv("Extract_900.csv")
extract1016df<-read.csv("Extract_1016.csv")

finaldf <- rbind(extract100df, extract200df, extract300df, extract400df, extract500df,
                 extract600df, extract700df, extract800df, extract900df, extract1016df)
write.csv <- ("FinalExtractData", row.names=FALSE)