如果使用 PHP 解析 XML 的话,那么常见的选择有如下几种:DOM、SimpleXML、XMLReader。如果要解析 XML 大文件的话,那么首先要排除的是 DOM,因为使用 DOM 的话,需要把整个文件全部加载才能解析,效率堪忧,相比较而言,SimpleXML 和 XMLReader 更好些,SimpleXML 相对简单,而 XMLReader 相对复杂,但是它可以自定义解析整个过程,特别是流式解析的特点让其效率更高。
下面我以一个 XML 大文件例子来对比一下 SimpleXML 和 XMLReader 的用法:
<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>
先看看用 SimpleXML 的话怎么搞:
<?php
$values = simplexml_load_file('file.xml');
foreach ($values as $value) {
var_dump($value);
}
?>
在看看用 XMLReader 的话怎么搞:
<?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;
}
}
}
?>
在本例中,XML 文件有几百万行,XMLReader 的效率是 SimpleXML 的两倍左右。
了解了相关知识,让我们看看如何选择合适的 XML 解析方法:如果规则比较复杂的话, 比如要查询当前节点的上下文,那么 DOM 是合理的选择;如果 XML 体积比较大的话,那么 XMLReader 是效率更高。不过如果没有特殊需求的话,那么尽量选择 SimpleXML,毕竟它用起来更简单。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有