如何使用PHP解析XML大文件

栏目: IT技术 · 发布时间: 5年前

内容简介:如果想使用 PHP 解析 XML 的话,那么有如下多种选择:下面我以工作中遇到的一个解析自百万行 XML 的例子来对比一下 SAX 和 PULL 的用法:先看看用 SAX 的话怎么搞:

如果想使用 PHP 解析 XML 的话,那么有如下多种选择: ExpatDOMSAXPULL 。其中比较常用的是 DOM、SAX、PULL。如果要解析 XML 大文件的话,那么首先要排除的是 DOM,因为使用 DOM 的话,需要把整个文件全部加载才能解析,效率堪忧,相比较而言,SAX 和 PULL 属于流式解析,可以边加载边解析,至于这二者的区别,SAX 相对简单,不需要自定义什么,而 PULL 相对复杂,可以自定义解析整个过程。

下面我以工作中遇到的一个解析自百万行 XML 的例子来对比一下 SAX 和 PULL 的用法:

<certificates>
  ...
  <certificate>
    <domain>...</domain>
    <id_status>...</id_status>
    <official_site_status>...</official_site_status>
    <business_status>...</business_status>
    <host>...</host>
    <auth_level>...</auth_level>
    <sitename>...</sitename>
    <sitetype>...</sitetype>
    <phone>...</phone>
    <auth_num>...</auth_num>
    <nickname0>...</nickname0>
    <icp>...</icp>
    <is_certed>...</is_certed>
    <is_official>...</is_official>
    <existed_years>...</existed_years>
    <addr>...</addr>
    <type>...</type>
  </certificate>
  ...
<certificates>

先看看用 SAX 的话怎么搞:

<?php

$values = simplexml_load_file('file.xml');

foreach ($values as $value) {
    var_dump($value);
}

?>

在看看用 PULL 的话怎么搞:

<?php

$xml = new XMLReader();
$xml->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。

如何使用PHP解析XML大文件


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

如何不在网上虚度人生

如何不在网上虚度人生

[美] 肯尼思·戈德史密斯 / 刘畅 / 北京联合出版公司 / 2017-9 / 39.80元

我们平时上网多大程度上是浪费时间,多大程度是在学习、关心社会、激发创造力?我们真能彻底断网,逃离社交网络吗? 手机把都市人变成一群电子僵尸,是福是祸? 浏览记录就是我们将来的回忆录吗?文件归档属于一种现代民间艺术? 不自拍、P图、发朋友圈,我还是我吗? 美国知名概念艺术家戈德史密斯认为:上网绝不是浪费时间,而是一种创造性的活动。在本书中他以跨学科角度、散文式语言进行论证,涉及大众传播学、计算......一起来看看 《如何不在网上虚度人生》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试