【问题标题】:Parse XML Files (>1 megabyte) in R在 R 中解析 XML 文件(>1 兆字节)
【发布时间】:2013-06-13 19:22:59
【问题描述】:

目前我有大约 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="")
}

问题是任何 >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 文件的任何建议。

谢谢!

【问题讨论】:

  • 试试xmlTreeParse(options = HUGE)
  • 工作出色——非常感谢!
  • 如果这回答了您的问题,请考虑将问题标记为已回答。 stackoverflow.com/help/accepted-answer
  • 谢谢 - 很抱歉没有早点弄清楚如何做。
  • 只是想知道您是否遇到过这种大小的文件的任何内存泄漏?我正在尝试解析大于 10Meg 的 XML,并且在我完成后没有任何量的 free()、rm()、gc() 在 XML 文档上,将(数百兆)内存释放到 O/ S(这是 Windows 7 64 位)。

标签: xml r xml-parsing


【解决方案1】:

要选择“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)

【讨论】:

  • 你能把这些十进制数加在一起吗(因为看起来它们只是二进制数中的位)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多