首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP XML 拉模式解析器 XMLReader 完整教學:高效率處理大型 XML 文件

     編輯:PHP 綜合知識

XMLReader 簡介

  • PHP 5 內建,流式(Streaming)拉解析器。
  • 按需讀取,記憶體佔用極低,適合超大 XML 檔案。
  • 程式控制解析進度(Iterator 模式),非事件推送(SAX/Observer 模式)。

應用場景:XML-RPC 請求處理

請求範例:

<?xml version="1.0"?>
<methodCall>
  <methodName>sqrt</methodName>
  <params>
    <param>
      <value><double>36.0</double></value>
    </param>
  </params>
</methodCall>

需求:驗證 methodName 為 sqrt,取得 double 參數,回傳平方根。

初始化與載入

$reader = new XMLReader();
$request = $HTTP_RAW_POST_DATA; // 或 file_get_contents('php://input')
$reader->XML($request); // 解析字串
// 或 $reader->open('https://example.com/feed.xml'); // 解析遠端/本地檔案

核心解析流程

<?php
function process_xmlrpc($reader) {
    // 移至 methodCall
    $reader->read();
    $reader->read(); // methodName
    $method = $reader->readString();

    if ($method !== 'sqrt') {
        return xmlrpc_error('Unsupported method');
    }

    // 移至 params/param/value/double
    while ($reader->read()) {
        if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'double') {
            $value = (float)$reader->readString();
            break;
        }
    }

    $result = sqrt($value);
    return xmlrpc_response($result);
}

function xmlrpc_response($val) {
    return '<?xml version="1.0"?><methodResponse><params><param><value><double>' . $val . '</double></value></param></params></methodResponse>';
}

常用 XMLReader 方法

方法說明
read()移至下一個節點,成功返回 true
readString()讀取當前元素的文字內容
readOuterXml()讀取當前節點含標籤的完整 XML
readInnerXml()讀取當前節點內部 XML
moveToAttribute($name)移至指定屬性
nodeType常數:ELEMENT, TEXT, ATTRIBUTE, END_ELEMENT 等
name當前節點名稱
depth節點深度

優勢總結

  • 記憶體使用量固定,不隨文件大小增長。
  • 可隨時中止解析,節省 CPU。
  • 程式碼結構清晰,易於維護複雜 XML 邏輯。

適用建議

  • 大型 XML(>10MB):XMLReader。
  • 小型配置檔、簡單資料:SimpleXML(樹狀、易用)。
  • 需 XPath、DOM 操作:DOMDocument。
  • 事件驅動習慣:XMLParser (SAX)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved