首页 / 网页编程 / PHP / PHP中的XML拉模式解析
PHP中的XML拉模式解析2009-12-24 Elliotte Rusty HarolPHP 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");无论是从何处获取原始数据,现在已建立了阅读器并为解析做好准备。