在 php 中解析非常大的 XML 文件

Posted

技术标签:

【中文标题】在 php 中解析非常大的 XML 文件【英文标题】:Parsing extremely large XML files in php 【发布时间】:2013-02-28 02:58:23 【问题描述】:

我需要解析 40GB 大小的 XML 文件,然后进行规范化,然后插入到 mysql 数据库中。我不清楚需要在数据库中存储多少文件,也不知道 XML 结构。

我应该使用哪个解析器,你会怎么做?

【问题讨论】:

对于大文件,总是使用像 XMLReader 这样的拉解析器;只需尝试将 40GB 的文件加载到 SimpleXML 的内存中。 来自相关帖子:***.com/questions/911663/… 40 Gb?哇,我在 mac os x 机器上处理 700 Mb xml 文件时遇到了麻烦。 我建议您编写自己的 XML 解析器,具有最少的功能(只有您想要的功能)。这样您就拥有了最轻量级的 XML 解析器,当然还会定期进行优化 @Girish - 这是一个疯狂的建议。地球上一些最优秀的程序员已经编写了高度优化的 XML 解析器,普通的 SO 发帖人能够做得更好的机会非常小。 【参考方案1】:

php 中,您可以使用 XMLReaderDocs 读取超大型 XML 文件:

$reader = new XMLReader();
$reader->open($xmlfile);

超大型 XML 文件应以压缩格式存储在磁盘上。至少这是有道理的,因为 XML 文件具有很高的压缩率。例如像large.xml.gz这样的gzip。

PHP 通过compression wrappersDocs 很好地支持XMLReader

$xmlfile = 'compress.zlib://path/to/large.xml.gz';

$reader = new XMLReader();
$reader->open($xmlfile);

XMLReader 允许您“仅”对当前元素进行操作。这意味着它是仅向前的。如果您需要保持解析器状态,您需要自己构建它。

我经常发现将基本动作包装到一组迭代器中很有帮助,这些迭代器知道如何对XMLReader 进行操作,例如仅迭代元素或子元素。您可以在Parse XML with PHP and XMLReader 中找到这一点。

参见:

PHP open gzipped XML

【讨论】:

【参考方案2】:

很高兴知道您实际上打算用 XML 做什么。您解析它的方式很大程度上取决于您需要执行的处理以及大小。

如果这是一次性的任务,那么我过去是通过在做任何其他事情之前发现 XML 结构来开始的。我的 DTDGenerator(参见 saxon.sf.net)很久以前就是为此目的而编写的,并且仍然可以完成这项工作,现在还有其他工具可用,但我不知道它们是否进行流式处理,这是这里的先决条件。

您可以编写一个使用拉式或推式流解析器(SAX 或 StAX)处理数据的应用程序。这有多容易取决于您必须进行多少处理以及您必须维护多少状态,而您没有告诉我们。或者,您可以尝试在 Saxon-EE 中提供的流式 XSLT 处理。

【讨论】:

以上是关于在 php 中解析非常大的 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

用于非常大的 XML 文件的 SAX 解析器

使用 PHP 和 XMLReader 解析 XML

在 java 中解析非常大的 XML 文档(以及更多)

如何在python中解析非常大的文件?

使用 XMLReader 解析大 XML 文件

使用 DOM 在 PHP 中解析 XML 文件