PHP 5引入了新的類 XMLReader,用於讀取可擴展標記語言(Extensible Markup Language,XML)。與SimpleXML或文檔對象模型(Document Object Model,DOM)不同,XMLReader 以流模式進行操作。即它從頭到尾讀取文檔。在文檔後面的內容編譯完成之前,可以先處理已編譯好的文檔前面的內容,從而實現非常快速、非常高效、非常節省地使用內存。需要處理的文檔越大,這個特點就越發重要。
與 Simple API for XML (SAX) 不同,XMLReader 是推解析器,而不是拉解析器。這意味著程序是可以控制的。您將告訴解析器何時獲取下一個文檔片段,而不是在解析器看到文檔後告訴您所看到的內容。您將請求內容,而不是對內容進行反應。從另一個角度來考慮這個問題:XMLReader 是 Iterator 設計模式的實現,而不是 Observer 設計模式的實現。
示例問題
先從簡單例子開始討論。假定正在編寫 PHP 腳本,用來接收 XML-RPC 請求並生成響應。更具體一些,假定請求如清單 1 所示。文檔的根元素是 methodCall,它包含 methodName 元素和 params 元素。方法的名稱是 sqrt。params 元素包含一個 param 元素,param 元素包含 double,double 的平方根是希望得到的值。沒有使用名稱空間。
清單 1. XML-RPC 請求
<?xml version="1.0"?>
<methodCall>
<methodName>sqrt</methodName>
<params>
<param>
<value><double>36.0</double></value>
</param>
</params>
</methodCall>
下面是 PHP 腳本需要完成的工作:
檢查方法名,如果不是 sqrt(它是該腳本懂得如何處理的惟一方法),則生成錯誤響應。
找到參數,如果參數不存在或參數類型錯誤,則生成錯誤響應。
另外,計算平方根。
在表單中返回結果,如清單 2 所示。
清單 2. XML-RPC 響應
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>6.0</double></value>
</param>
</params>
</methodResponse>
下面我們逐步展開說明。
初始化解析器並載入文檔
第一步是創建新的解析器對象。創建操作很簡單:
$reader = new XMLReader();
接著,需要為它提供一些用於解析的數據。對於 XML-RPC,這是超文本傳輸協議(Hypertext Transfer Protocol,HTTP)請求的原始主體。然後可以將該字符串傳遞到讀取器的 XML() 函數:
$request = $HTTP_RAW_POST_DATA;
$reader->XML($request);
可以解析任何字符串,無論它是從何處獲取的。例如,可以是程序中的一串文字或從本地文件讀取。還可以使用 open() 函數從外部 URL 載入數據。例如,下面的語句准備解析其中一個 Atom 提要:
$reader->XML('http://www.cafeaulait.org/today.atom');
無論是從何處獲取原始數據,現在已建立了閱讀器並為解析做好准備。