php开源嘛
首页 | English | MySql数据库 | Php编程 | 建站杂烩 | 系统服务器 | 资源共享 | 专题 | 才桀网 | 支持论坛
  当前位置:主页>Php编程>文章内容
PHP中的XML拉模式解析
来源:网络 作者:本站整理 发布时间:2007-10-11  
PHP中的XML拉模式解析

  研究与 PHP 5 捆绑在一起的 XMLReader 库,它使 PHP 页面能够以高效的流模式来处理 XML 文档。phpma.com

  PHP 5 引入了新的类 XMLReader,用于读取可扩展标记语言(Extensible Markup Language,XML)。与 SimpleXML 或文档对象模型(Document Object Model,DOM)不同,XMLReader 以流模式进行操作。即它从头到尾读取文档。在文档后面的内容编译完成之前,可以先处理已编译好的文档前面的内容,从而实现非常快速、非常高效、非常节省地使用内存。需要处理的文档越大,这个特点就越发重要。

  libxmlphpma.com

  这里所说的 XMLReader API 位于 Gnome Project 中用于 C 和 C++ 的 libxml 库之上。实际上 XMLReader 只是在 libxml 的 XmlTextReader API 之上的很薄的 PHP 层。XmlTextReader 本身是模仿 .NET 的 XmlTextReader 类和 XmlReader 类,尽管并不具有与这些类相似的代码。

  与 Simple API for XML (SAX) 不同,XMLReader 是推解析器,而不是拉解析器。这意味着程序是可以控制的。您将告诉解析器何时获取下一个文档片段,而不是在解析器看到文档后告诉您所看到的内容。您将请求内容,而不是对内容进行反应。从另一个角度来考虑这个问题:XMLReader 是 Iterator 设计模式的实现,而不是 Observer 设计模式的实现。

  示例问题phpma.com

  先从简单例子开始讨论。假定正在编写 PHP 脚本,用来接收 XML-RPC 请求并生成响应。更具体一些,假定请求如清单 1 所示。文档的根元素是 methodCall,它包含 methodName 元素和 params 元素。方法的名称是 sqrt。params 元素包含一个 param 元素,param 元素包含 double,double 的平方根是希望得到的值。没有使用名称空间。

  清单 1. XML-RPC 请求phpma.com

  

<?xml version="1.0"?>
<methodCall>
  <methodName>sqrt</methodName>
  <params>
    <param>
      <value><double>36.0</double></value>
    </param>
  </params>
</methodCall>

 

  下面是 PHP 脚本需要完成的工作:

  1、检查方法名,如果不是 sqrt(它是该脚本懂得如何处理的惟一方法),则生成错误响应。

  2、找到参数,如果参数不存在或参数类型错误,则生成错误响应。

  3、另外,计算平方根。

  4、在表单中返回结果,如清单2 所示。

  清单 2. XML-RPC 响应phpma.com

  

<?xml version="1.0"?>
<methodResponse>
  <params>
    <param>
      <value><double>6.0</double></value>
    </param>
  </params>
</methodResponse>

 

  下面我们逐步展开说明。phpma.com

  初始化解析器并载入文档

  第一步是创建新的解析器对象。创建操作很简单:

$reader = new XMLReader();

  接着,需要为它提供一些用于解析的数据。对于 XML-RPC,这是超文本传输协议(Hypertext Transfer Protocol,HTTP)请求的原始主体。然后可以将该字符串传递到读取器的 XML() 函数:

  填充原始发送数据phpma.com

 

  $request = $HTTP_RAW_POST_DATA;
  $reader->XML($request);

 

  如果发现 $HTTP_RAW_POST_DATA 是空的,则将以下代码行添加到 php.ini 文件:

 

  always_populate_raw_post_data = On

 phpma.com

  可以解析任何字符串,无论它是从何处获取的。例如,可以是程序中的一串文字或从本地文件读取。还可以使用 open() 函数从外部 URL 载入数据。例如,下面的语句准备解析其中一个 Atom 提要:

  $reader->XML('http://www.cafeaulait.org/today.atom');

  无论是从何处获取原始数据,现在已建立了阅读器并为解析做好准备。

  读取文档

  read() 函数使解析器前进到下一个标记。最简单的方法是在 while 循环中遍历整个文档:phpma.com

   while ($reader->read()) {
  // processing code goes here...
  }phpma.com

  完成遍历后,关闭解析器以释放它所持有的任何资源,并且重置解析器以便用于下一个文档:

  $reader->close();

  在循环内部,将解析器放置在特殊节点上:元素的起点、元素的终点、文本节点、注释等等。通过检查以下属性,可以发现解析器正在查看的内容:

  1.   localName 是本地的、未带前缀的节点名。
  2.   name 是可能的节点前缀名。对于像注释这种没有名称的节点,包括 #comment、#text、#document 等等,与 DOM 中的一样。
  3.   namespaceURI 是节点名称空间的统一资源标识符(Uniform Resource Identifier,URI)。
  4.   nodeType 是代表节点类型的整数 —— 例如,2 代表属性节点,7 代表处理指令。
  5.   prefix 是节点的名称空间前缀。
  6.   value 是节点的下一个文本内容。
  7.   如果节点有文本值,hasValue 值为 true;否则,值为 false。

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

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

  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

 
(阅读次数:

共3页: 上一页 1 [2] [3] 下一页
上一篇:MySQL数据库中Show命令用法   下一篇:Linux系统至少有N大点比Vista更好
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·PHP生成验证码图片的源代码
·PHP会话对(Session)使用入门
·Php部分常见问题总结[bug]
·php正则表达式的快速学习方法
·高手传经:学习PHP重在坚持
·用php生成静态页面的php函数
·PHP对文本数据库的基本操作方法
·用 PHP 读取文件的正确方法
·讲解PHP+MySQL的分页显示示例
·用PHP构建一个简易监视引擎
·我是怎样打造简单的PHP&MYSQL留
·用PHP实现表单验证码登陆校验
  相关文章
·PHP和JS实现普通HTTP上安全地传
·PHP动态网站开发中常用的N个小技
·学习PHP向MYSQL中插入数据的代码
·对PHP认识、历史、优势、展望、
·认真研究PHP开发中的中文编码问
·php名词、php代称等解释一览表..
·PHP与MYSQL的结合操作实例代码..
·一个简易的PHP上传文件的代码
·PHP如何连接ORACLE数据库?
·详解phplib模板使用过程及运行原
·PHP生成静态页面、古老的技术新
·PHP程序中使用session错误调试问

关于我们 | 本站声明 | 友情连接 | 诚邀加盟 | 网站地图
版权Power by DedeCms   技术支持QQ =>> 罗江游鱼   Jacking  后台登陆
Copyright @ 2007 公司地址:柳州市东环路268号 邮编:545006 电话:15920389818 桂ICP备07006725号