我需要解析 40GB 大小的 XML 文件,然后进行规范化,然后插入到 MySQL 数据库中。我不清楚需要在数据库中存储多少文件,也不知道 XML 结构。
我应该使用哪个解析器,你会怎么做呢?
我需要解析 40GB 大小的 XML 文件,然后进行规范化,然后插入到 MySQL 数据库中。我不清楚需要在数据库中存储多少文件,也不知道 XML 结构。
我应该使用哪个解析器,你会怎么做呢?
XMLReader
在 PHP 中,您可以使用Docs读取超大型 XML 文件:
$reader = new XMLReader();
$reader->open($xmlfile);
超大型 XML 文件应以压缩格式存储在磁盘上。至少这是有道理的,因为 XML 文件具有很高的压缩率。例如像 gzip 一样large.xml.gz
。
XMLReader
PHP通过压缩包装器Docs很好地支持了这一点:
$xmlfile = 'compress.zlib://path/to/large.xml.gz';
$reader = new XMLReader();
$reader->open($xmlfile);
允许您“XMLReader
仅”对当前元素进行操作。这意味着它是仅向前的。如果您需要保持解析器状态,您需要自己构建它。
我经常发现将基本动作包装到一组迭代器中很有帮助,这些迭代器知道如何操作,XMLReader
比如只迭代元素或子元素。您可以在Parse XML with PHP and XMLReader中找到这一点。
另见:
很高兴知道您实际上打算用 XML 做什么。您解析它的方式很大程度上取决于您需要执行的处理以及大小。
如果这是一次性的任务,那么我过去是通过在做任何其他事情之前发现 XML 结构来开始的。我的 DTDGenerator(参见 saxon.sf.net)很久以前就是为此目的而编写的,并且仍然可以完成这项工作,现在还有其他可用的工具,但我不知道它们是否进行流式处理,这是这里的先决条件。
您可以编写一个使用拉或推流解析器(SAX 或 StAX)处理数据的应用程序。这有多容易取决于您必须进行多少处理以及您必须维护多少状态,而您没有告诉我们。或者,您可以尝试在 Saxon-EE 中提供的流式 XSLT 处理。