快速业务通道

PHP中的XML拉模式解析

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
是代表节点类型的整数 —— 例如,2 代表属性节点,7 代表处理指令。

prefix 是节点的名称空间前缀。

value 是节点的下一个文本内容。

如果节点有文本值,hasValue 值为 true;否则,值为 false。

当然,并非所有节点类型都具有所有这些属性。例如,文本节点、CDATA 部件、注释、处理指令、属性、空格、文档类型和 XML 声明具有值。而其它节点类型(最重要的是元素和文档)则没有值。通常,程序将使用 nodeType 属性来断定它所查找的内容,然后做出适当的响应。清单 3 展示了简单的 while 循环,该循环使用这些函数来打印它所查看的内容。清单 4 展示了将清单 1 输入程序后的输出。

清单 3. 解析器所查看的内容

while ($reader->read()) {
   echo $reader->name;
   if ($reader->hasValue) {
    echo ": " . $reader->value;
   }
   echo "\n";
  }

清单 4. 清单 3 的输出

methodCall
#text:

methodName
#text: sqrt
methodName
#text:

params
#text:

param
#text:

value
double
#text: 10
double
value
#text:

param
#text:

params
#text:
methodCall

大多数程序并非这么简单。它们接受特定格式的输入,并以某种方式来处理输入。在 XML-RPC 例子中,仅需要读取输入中的一个元素:double 元素,该元素应该只有一个。为此,查找名称为 double 的元素的起点:

if ($reader->name == "double"
 && $reader->nodeType == XMLReader::ELEMENT) {
  // ...
}

该元素可能有单个文本子节点,可以通过将解析器前进到下一个节点来进行读取,如下所示:

if ($reader->name == "double" && $reader->nodeType == XMLReader::ELEMENT) {
  $reader->read();
  respond($reader->value);
}

在这里 respond() 函数构建了 XML-RPC 响应并将它发送到客户机。但是,在展示上述操作前,还有一些事情需要处理。不能绝对保证请求文档中的 double 元素仅包含一个文本节点。可能包含多个文本节点,以及注释和处理指令。例如,可能看起来像以下代码:

<value><double>
 <!--value follows-->6.<!--fractional part next-->0
</double></value>

一个健壮的解决方案需要获得 double 元素的所有文本子节点,将它们连接起来,并且仅将结果转换为 double。必须小心避免任何注释或可能出现的其它非文本节点。这有一点复杂,但并不是十分复杂,如清单 5 所示。

清单 5. 累积来自一个元素的所有文本内容

while ($reader->read()) {
  if ($reader->nodeType == XMLReader::TEXT
   || $reader->nodeType == XMLReader::CDATA
   || $reader->nodeType == XMLReader::WHITESPACE
   || $reader->nodeType == XMLReader::SIGNIFICANT_WHITESPACE) {
    $input .= $reader->value;
  }
  else if ($reader->nodeType == XMLReader::END_ELEMENT
   && $reader->name == "double") {
    break;
  }
 }

您可以暂时忽略文档中的其它任何内容。(稍后我将添加更多的错误处理。)

构建响应

正如它的名称所暗示的,XMLReader 仅仅用于读取。相应的 XMLWriter 类正在开发中,但还不能投入到生产。幸运的是,写入 XML 比读取 XML 要容易得多。首先,应使用 header() 函数来设置响应的媒体类型。对于 XML-RPC 来说,媒体类型是 application/xml。例如:

header(''Content-type: application/xml'');

通常直接将内容显示在页面上,如清单 6 中的 respond() 函数所示。

清单 6. Echo XML

function respond($input) {

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号