8

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

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

4

2 回答 2

12

XMLReader在 PHP 中,您可以使用Docs读取超大型 XML 文件:

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

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

XMLReaderPHP通过压缩包装器Docs很好地支持了这一点:

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

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

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

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

另见:

于 2013-03-12T23:16:15.240 回答
2

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

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

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

于 2013-03-12T18:40:46.470 回答