如何使用PHP解析XML大文件
2010 年 5 月 2 日
如果想使用 PHP 解析 XML 的话,那么有如下多种选择: Expat 、 DOM 、 SAX 、 PULL 。其中比较常用的是 DOM、SAX、PULL。如果要解析 XML 大文件的话,那么首先要排除的是 DOM,因为使用 DOM 的话,需要把整个文件全部加载才能解析,效率堪忧,相比较而言,SAX 和 PULL 属于流式解析,可以边加载边解析,至于这二者的区别,SAX 相对简单,不需要自定义什么,而 PULL 相对复杂,可以自定义解析整个过程。
下面我以工作中遇到的一个解析自百万行 XML 的例子来对比一下 SAX 和 PULL 的用法:
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
先看看用 SAX 的话怎么搞:
在看看用 PULL 的话怎么搞:
open('file.xml'); for ($name = null, $value = []; $xml->read(); null) { if ($xml->nodeType == XMLReader::ELEMENT) { $name = $xml->name; if ($name == 'certificate') { if ($value) { var_dump($value); } $value = []; continue; } } if ($xml->nodeType == XMLReader::TEXT) { if ($name) { $value[$name] = $xml->value; } } } ?>
在本例中,PULL 的效率是 SAX 的两倍左右。
了解了相关知识,让我们看看如何选择合适的 XML 解析方法:如果规则比较复杂的话, 比如要查询当前节点的上下文,那么 DOM 是合理的选择;如果 XML 体积比较大的话,那么 SAX 和 PULL 是合理的选择,具体到这两者的话,对效率不是特别敏感的话,建议选择 SAX,因为它用起来更简单,否则选择 PULL。