首页 > 开发 > PHP > 正文

PHP的XML模式详解

2024-05-04 22:58:05
字体:
来源:转载
供稿:网友

  研究与 php(做为现在的主流开发语言) 5 捆绑在一起的 xml(标准化越来越近了)reader 库,它使 php(做为现在的主流开发语言) 页面能够以高效的流模式来处理 xml(标准化越来越近了) 文档。

  php(做为现在的主流开发语言) 5 引入了新的类 xml(标准化越来越近了)reader,用于读取可扩展标记语言(extensible markup language,xml(标准化越来越近了))。与 simplexml(标准化越来越近了) 或文档对象模型(document object model,dom)不同,xml(标准化越来越近了)reader 以流模式进行操作。即它从头到尾读取文档。在文档后面的内容编译完成之前,可以先处理已编译好的文档前面的内容,从而实现非常快速、非常高效、非常节省地使用内存。需要处理的文档越大,这个特点就越发重要。

  libxml(标准化越来越近了)

  这里所说的 xml(标准化越来越近了)reader api 位于 gnome project 中用于 c 和 c++ 的 libxml(标准化越来越近了) 库之上。实际上 xml(标准化越来越近了)reader 只是在 libxml(标准化越来越近了) 的 xml(标准化越来越近了)textreader api 之上的很薄的 php(做为现在的主流开发语言) 层。xml(标准化越来越近了)textreader 本身是模仿 .net 的 xml(标准化越来越近了)textreader 类和 xml(标准化越来越近了)reader 类,尽管并不具有与这些类相似的代码。

  与 simple api for xml(标准化越来越近了) (sax) 不同,xml(标准化越来越近了)reader 是推解析器,而不是拉解析器。这意味着程序是可以控制的。您将告诉解析器何时获取下一个文档片段,而不是在解析器看到文档后告诉您所看到的内容。您将请求内容,而不是对内容进行反应。从另一个角度来考虑这个问题:xml(标准化越来越近了)reader 是 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(做为现在的主流开发语言) 脚本需要完成的工作:

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

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

  3、另外,计算平方根。

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

  清单 2. xml(标准化越来越近了)-rpc 响应

以下是引用片段:
<?xml(标准化越来越近了) version="1.0"?>
<methodresponse>
  <params>
    <param>
      <value><double>6.0</double></value>
    </param>
  </params>
</methodresponse>

  下面我们逐步展开说明。

  初始化解析器并载入文档

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

以下是引用片段:
$reader = new xml(标准化越来越近了)reader();

  接着,需要为它提供一些用于解析的数据。对于 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(标准化越来越近了)('
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表