PHP的XMLReader怎么用 pull解析器用法

23次阅读

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

PHP的XMLReader怎么用 pull解析器用法

PHP 的 XMLReader 是一个基于 libxml 的**只读、前向、低内存占用的 XML Pull 解析器**,适合处理大文件或流式 XML 数据。它不构建 dom 树,而是逐个读取节点(如元素开始、结束、文本、属性等),由你控制解析流程。

基本用法:打开、遍历、读取节点

核心是创建实例 → 打开 XML 源(字符串、文件、URL)→ 循环调用 read() → 根据 nodeType 和属性判断当前节点类型并提取内容。

  • XMLReader::open($filename) 加载本地文件;用 XMLReader::XML($String) 加载字符串;支持 setParserProperty() 控制命名空间、空白处理等
  • read() 移动到下一个节点,返回 true 表示成功,false 表示结束或出错
  • 常用属性:nodeType常量XMLReader::ELEMENTXMLReader::TEXT)、name(标签名)、value(文本内容)、depth(嵌套层级)

提取元素内容:区分开始标签、文本、结束标签

XMLReader 把一个 `

<a href="https://seo.sqjnqi.com/tag/php%e6%95%99%e7%a8%8b/"><b>php教程</b></a>` 拆成三个独立节点:`ELEMENT`(start tag)、`TEXT`(内容)、`END_ELEMENT`(end tag)。需按顺序识别才能正确获取值。

  • 遇到 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 写逻辑)
text=ZqhQzanResources