|
PHP中的XML拉模式解析(2) <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);
如果发现 $HTTP_RAW_POST_DATA 是空的,则将以下代码行添加到 php.ini 文件:
always_populate_raw_post_data = On
可以解析任何字符串,无论它是从何处获取的。例如,可以是程序中的一串文字或从本地文件读取。还可以使用 open() 函数从外部 URL 载入数据。例如,下面的语句准备解析其中一个 Atom 提要:
$reader->XML('http://www.cafeaulait.org/today.atom');
无论是从何处获取原始数据,现在已建立了阅读器并为解析做好准备。
读取文档
read() 函数使解析器前进到下一个标记。最简单的方法是在 while 循环中遍历整个文档:
while ($reader->read()) { // processing code goes here... }
完成遍历后,关闭解析器以释放它所持有的任何资源,并且重置解析器以便用于下一个文档:
$reader->close();
在循环内部,将解析器放置在特殊节点上:元素的起点、元素的终点、文本节点、注释等等。通过检查以下属性,可以发现解析器正在查看的内容:
- localName 是本地的、未带前缀的节点名。
- name 是可能的节点前缀名。对于像注释这种没有名称的节点,包括 #comment、#text、#document 等等,与 DOM 中的一样。
- namespaceURI 是节点名称空间的统一资源标识符(Uniform Resource Identifier,URI)。
- nodeType 是代表节点类型的整数 —— 例如,2 代表属性节点,7 代表处理指令。
- prefix 是节点的名称空间前缀。
- value 是节点的下一个文本内容。
- 如果节点有文本值,hasValue 值为 true;否则,值为 false。
当然,并非所有节点类型都具有所有这些属性。例如,文本节点、CDATA 部件、注释、处理指令、属性、空格、文档类型和 XML 声明具有值。而其它节点类型(最重要的是元素和文档)则没有值。通常,程序将使用 nodeType 属性来断定它所查找的内容,然后做出适当的响应。清单 3 展示了简单的 while 循环,该循环使用这些函数来打印它所查看的内容。清单 4 展示了将清单 1 输入程序后的输出。
清单 3. 解析器所查看的内容
while ($reader->read()) {
|