快速业务通道

PHP中的XML拉模式解析

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
   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;
      }
     }
     break;
   }
  }
  // make sure the input was well-formed
  if (isset($php_errormsg) ) fault(21, $php_errormsg);
  else if ($input < 0) fault(20, "Cannot take square root of negative number");
  else respond($input);

这是 XML 流处理中简单的常见模式。解析器将填写一个数据结构,当完成文档时该数据结构将起作用。通常数据结构要比文档本身简单。这里所使用的数据结构尤其简单:一个字符串。

验证

到目前为止,对于验证数据是否位于所预期的地方,并没有给予关注。实现该验证的最简单的方法是检查文档的模式。XMLReader 支持 RELAX NG 模式语言;清单 9 展示了简单的 RELAX NG 模式,用于这个特定的 XML-RPC 请求表单。

清单 9. XML-RPC 请求

<element name="methodCall" xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
 <element name="methodName">
  <value>sqrt</value>
 </element>
 <element name="params">
  <element name="param">
   <element name="value">
    <element name="double">
     <data type="double"/>
    </element>
   </element>
  </element>
 </element>
</element>

可以使用 setRelaxNGSchemaSource() 将模式作为一串文字直接嵌入 PHP 脚本,或者使用 setRelaxNGSchema() 从外部文件或 URL 读取模式。例如,假定清单 9 位于 sqrt.rng 文件中,下面将展示如何载入模式:

reader->setRelaxNGSchema("sqrt.rng")

在开始解析文档 之前,执行上述操作。解析器在进行读取时将检查文档的模式。若要检查文档是否有效,则调用 isValid(),如果文档是有效的(目前为止),则返回 true,否则,返回 false。清单 10 展示了完整的程序,包括所有错误处理。这样将接受任何合法输入,然后返回正确的值,而且将拒绝所有不正确的请求。我还添加了 fault() 方法,当发生故障时将发送 XML-RPC 错误响应。

清单 10. 完整的 XML-RPC 平方根服务器

<?php
header(''Content-type: application/xml'');
// try grammar
$schema = "<element name=''methodCall''
          xmlns=''http://relaxng.org/ns/structure/1.0''
          datatypeLibrary=''http://www.w3.org/2001/XMLSchema-datatypes''>
 <element name=''methodName''>
  <value>sqrt</value>
 </element>
 <element name=''params''>
  <element name=''param''>
   <element name=''value''>
    <element name=''double''>
     <data type=''double''/>
    </element>
   </element>
  </element>
 </element>

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号