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

时间:2013-03-12 14:24:36

标签: php mysql xml xml-parsing large-files

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

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

2 个答案:

答案 0 :(得分:11)

在PHP中,您可以使用XMLReaderDocs

读取极大的XML文件
$reader = new XMLReader();
$reader->open($xmlfile);

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

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中找到这一点。

参见:

答案 1 :(得分:2)

了解您实际打算如何处理XML会很高兴。解析它的方式在很大程度上取决于您需要执行的处理以及大小。

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

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