如何使用PHP XMLReader检查超大XML文件的语法合法性
超大XML文件PHP语法校验实现方案
需求背景
我目前使用PHP的XMLReader处理XML文件,需要实现不依赖DTD的简单XML语法合法性校验,仅确认文件语法合规,避免文件尾部损坏等问题导致后续节点遍历出错。
业务约束
- 存在多份高频变更的XML文件,无需做DTD有效性校验,仅做语法合规性校验
- 部分XML文件大小超过2GB,无法使用DOM方式加载校验,否则内存占用过高会导致程序崩溃
原有方案缺陷
之前尝试了DOM加载校验的方案,仅对小文件有效,代码如下:
$dom = new DOMDocument; if(!@$dom->load('example.xml')){ die("syntax error"); }
我了解到firstobject XML editor这类工具可在1.7秒内完成30GB XML的语法错误定位,因此想确认PHP的XMLReader是否可以实现类似的轻量快速校验。
补充1
目前我临时采用文件大小判断的分流方案:小于阈值的文件用DOM校验,大文件计划调用第三方命令行工具校验,后续找到稳定方案会更新。
补充2
Progman提出的XMLReader全量遍历校验是目前已知的最优解,但该方案需要遍历整个XML文件,会使处理时长翻倍,我还在寻找更快速的校验方案,若无更合适的方案会采用该方案。
补充3:最终可行方案
我对Progman的方案做了适配,避免和自定义的set_error_handler冲突,通过开启libxml_use_internal_errors(true)捕获错误即可实现校验,示例代码如下:
libxml_use_internal_errors(true); $xml = new XMLReader(); $xml->open("large.xml"); while($xml->read()); foreach (libxml_get_errors() as $error) { print_r($error); }
内容的提问来源于stack exchange,提问作者user5333087
相关产品推荐
相关产品推荐

