XMLReader 是 PHP 基于拉模式的轻量级 XML 解析器,逐节点读取、内存占用低;通过 read() 遍历节点,用 nodeType 和 name 定位元素,getAttribute() 读属性,readString() 安全获取非空文本,depth 控制嵌套层级。

PHP 的 XMLReader 是一个基于拉模式(Pull Parsing)的 XML 解析器,适合处理大文件、内存受限或只需部分数据的场景。它不像 DOM 那样一次性加载整个文档,而是像“读取器”一样逐节点推进,边读边处理,内存占用低、速度快。
初始化和基本遍历
先创建实例,打开 XML 文件或字符串,然后用 read() 逐个移动到下一个节点:
$reader = new XMLReader();-
$reader->open('data.xml');或$reader->xml($xmlString); - 循环调用
$reader->read(),返回true表示还有节点,false表示结束 - 当前节点信息通过属性获取:如
$reader->nodeType、$reader->name、$reader->value(文本内容)、$reader->depth等
识别并提取关键节点
常用节点类型常量有:XMLReader::ELEMENT(开始标签)、XMLReader::END_ELEMENT(结束标签)、XMLReader::TEXT(文本内容)、XMLReader::ATTRIBUTE(属性)。实际中多按元素名过滤:
- 用
if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'item')定位目标元素 - 进入元素后,可用
$reader->readInnerXml()读取其全部子内容(含标签),或用$reader->readOuterXml()包含自身标签 - 读取属性:在
ELEMENT节点上调用$reader->getAttribute('id')或遍历所有属性用$reader->moveToFirstAttribute()配合循环
安全读取文本内容(避免空格干扰)
XML 中换行缩进会产生大量 TEXT 节点(仅含空白),直接取 $reader->value 可能为空或不可靠。推荐做法:
立即学习“PHP免费学习笔记(深入)”;
- 检查
$reader->nodeType === XMLReader::TEXT && trim($reader->value) !== '' - 更稳妥的方式是:定位到目标元素后,调用
$reader->read()进入其子节点,再用$reader->readString()—— 它会自动跳过空白节点,返回紧邻的非空文本内容 - 例如解析
:先停在Hello title开始标签,再调一次read()到TEXT节点,然后readString()得到 "Hello"
嵌套结构与深度控制
处理带层级的 XML(如 RSS、配置文件)时,可借助 $reader->depth 判断当前嵌套层级,或用 $reader->isEmptyElement 快速识别自闭合标签(如 ):
- 进入某元素前记录当前
$depth,之后循环read()直到$reader->depth ,即退出该作用域 - 对复合结构(如多个
各含和),可在进入user时初始化数组,遇到子元素时提取值并赋给对应键 - 记得在处理完一组数据后调用
$reader->next('user')快速跳到下一个同名元素,避免手动遍历
不复杂但容易忽略细节,关键是理解“拉”的节奏:你决定什么时候读、读多少、读到哪一层。用好 read()、readString()、getAttribute() 和 depth,就能稳稳解析任意大小的 XML。










