XMLReader 是 PHP 中基于 libxml 的只读、前向、低内存 XML Pull 解析器,适合处理大文件;通过 open()/XML() 加载源,read() 遍历节点,依 nodeType、name、value 等属性提取数据,并可结合 SimpleXML 局部解析。

PHP 的 XMLReader 是一个基于 libxml 的**只读、前向、低内存占用的 XML Pull 解析器**,适合处理大文件或流式 XML 数据。它不构建 DOM 树,而是逐个读取节点(如元素开始、结束、文本、属性等),由你控制解析流程。
基本用法:打开、遍历、读取节点
核心是创建实例 → 打开 XML 源(字符串、文件、URL)→ 循环调用 read() → 根据 nodeType 和属性判断当前节点类型并提取内容。
- 用
XMLReader::open($filename)加载本地文件;用XMLReader::XML($string)加载字符串;支持setParserProperty()控制命名空间、空白处理等 -
read()移动到下一个节点,返回true表示成功,false表示结束或出错 - 常用属性:
nodeType(常量如XMLReader::ELEMENT、XMLReader::TEXT)、name(标签名)、value(文本内容)、depth(嵌套层级)
提取元素内容:区分开始标签、文本、结束标签
XMLReader 把一个 `
- 遇到
XMLReader::ELEMENT且有子文本(即下一个是TEXT),可先记下标签名,再调用一次read()取value - 更稳妥方式:用
isEmptyElement判断是否自闭合;用moveToFirstAttribute()+moveToNextAttribute()遍历属性 - 示例逻辑:
if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'item') { $reader->read(); if ($reader->nodeType === XMLReader::TEXT) echo $reader->value; }
跳过无关节点 & 定位目标结构
实际 XML 常含空格、换行、注释、CDATA 等干扰节点。默认会读取所有,需主动过滤。
立即学习“PHP免费学习笔记(深入)”;
- 设置
$reader->setParserProperty(XMLReader::SUBST_ENTITIES, true)展开实体(如&) - 跳过空白文本:
if ($reader->nodeType === XMLReader::TEXT && trim($reader->value) === '') continue; - 用
next($localName)快速跳到下一个同名元素(例如跳到下一个product),避免手动循环 - 用
readInnerXML()或readOuterXML()获取当前节点及其子树的原始 XML 字符串(适合嵌套复杂结构)
配合 SimpleXML 或 DOM 做局部解析
XMLReader 本身不提供 XPath 或节点查找,但可以“定位”到某段 XML 后,转交其他扩展处理。
- 当
XMLReader走到某个关键元素(如)时,调用readOuterXML()获取完整片段 - 再用
simplexml_load_string()或DOMDocument::loadXML()解析该小段,享受 XPath、对象访问等便利 - 这样兼顾了内存效率(大文件靠 Reader 流式定位)和开发效率(局部用 SimpleXML 写逻辑)











