在R中解析XML文件(> 1兆字节)

时间:2013-06-17 18:29:41

标签: xml r xml-parsing

目前我有大约20,000个XML文件,大小从几KB到几MB不等。虽然它可能不太理想,但我使用XML包中的“xmlTreeParse”函数来遍历每个文件并提取我需要的文本并将文档保存为csv文件。

以下代码适用于文件< 1 MB的大小:

files <- list.files()
for (i in files) {
    doc <- xmlTreeParse(i, useInternalNodes = TRUE)
    root <- xmlRoot(doc)

    name <- xmlValue(root[[8]][[1]][[1]]) # Name
    data <- xmlValue(root[[8]][[1]]) # Full text

    x <- data.frame(c(name))
    x$data <- data

    write.csv(x, paste(i, ".csv"), row.names=FALSE, na="")
}

问题是任何文件&gt; 1 MB都会给我以下错误:

Excessive depth in document: 256 use XML_PARSE_HUGE option
Extra content at the end of the document
Error: 1: Excessive depth in document: 256 use XML_PARSE_HUGE option
2: Extra content at the end of the document

请原谅我的无知,但是我已经尝试在XML包中搜索“XML_PARSE_HUGE”函数,但似乎无法找到它。有没有人有使用此功能的经验?如果是这样,我将非常感谢有关如何使此代码处理稍大的XML文件的任何建议。

谢谢!

1 个答案:

答案 0 :(得分:2)

要选择“XML_PARSE_HUGE”,您需要在选项中对其进行规定。 XML:::parserOptions列出了选项选项:

> XML:::parserOptions
   RECOVER      NOENT    DTDLOAD    DTDATTR   DTDVALID    NOERROR  NOWARNING 
         1          2          4          8         16         32         64 
  PEDANTIC   NOBLANKS       SAX1   XINCLUDE      NONET     NODICT    NSCLEAN 
       128        256        512       1024       2048       4096       8192 
   NOCDATA NOXINCNODE    COMPACT      OLD10  NOBASEFIX       HUGE     OLDSAX 
     16384      32768      65536     131072     262144     524288    1048576 

例如

> HUGE
[1] 524288

使用任何这些选项声明整数向量是足够的。在你的情况下

xmlTreeParse(i, useInternalNodes = TRUE, options = HUGE)