我需要解析大小为40GB的XML文件,然后进行规范化,并插入到MySQL数据库中。我需要在数据库中存储多少文件不清楚,我也不知道XML结构。
我应该使用哪种解析器,你会怎么做呢?
答案 0 :(得分:11)
在PHP中,您可以使用XMLReader
Docs:
$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中使用。