background image

作者:大自然

PHP 的 XML

 

分析函数

首先我得承认我喜欢计算机标准。如果每个人都遵从这个行业的标准,互联网将会是一个更好的媒体。使用标准
化的数据交换格式才能使开放的和独立于平台的计算模式切实可行。这就是我作为

XML

 

爱好者的原因。

幸运的是,我最喜爱的脚本语言不但支持

XML 而且对其支持正不断加强。PHP 可以让我迅速将 XML 文档发布到互

联网上,收集

XML 文档的统计信息,将 XML 文档转换成其它格式。例如,我时常用 PHP 的 XML 处理能力来管理我

XML

 

所写的文章和书。

本文中,我将讨论任何用

PHP 内建的 Expat 解析器来处理 XML 文档。通过范例,我将演示 Expat 的处理方法。

 

同时,范例可以告诉你如何:

  

建立你自己的处理函数

XML 文档转换成你自己的 PHP

 

数据结构

介绍

Expat 

XML 的解析器,同样称为 XML 处理器,可以使程序访问 XML 文档的结构和内容。Expat 是 PHP 脚本语言的 XML
解析器。它同时也运用在其它项目中,例如

Mozilla、Apache 和 Perl  

 

什么是基于事件的解析器?

XML

 

解析器的两种基本类型:

基于树型的解析器:将

XML 文档转换成树型结构。这类解析器分析整篇文章,同时提供一个 API 来访问所产生树

的每个元素。其通用的标准为

DOM

  

(文档对象模式)。

基于事件的解析器:将

XML 文档视为一系列的事件。当一个特殊事件发生时,解析器将调用开发者提供的函数来

  

处理。
基于事件的解析器有一个

XML 文档的数据集中视图,也就是说它集中在 XML 文档的数据部分,而不是其结构。这

些解析器从头到尾处理文档,并将类似于-元素的开始、元素的结尾、特征数据的开始等等-事件通过回调

callback)函数报告给应用程序。以下是一个"Hello-World"的 XML

 

文档范例:

<greeting>  
Hello World  

</greeting>  

 

基于事件的解析器将报告为三个事件:

开始元素:

greeting  

CDATA 项的开始,值为:Hello World  
结束元素:

greeting  

不像基于树型的解析器,基于事件的解析器不产生描述文档的结构。在

CDATA 项中,基于事件的解析器不会让你

得到父元素

greeting

 

的信息。

然而,它提供一个更底层的访问,这就使得可以更好地利用资源和更快地访问。通过这种方式,就没有必要将整

 

个文档放入内存;而事实上,整个文档甚至可以大于实际内存值。

Expat 就是这样的一种基于事件的解析器。当然如果使用 Expat,必要时它一样可以在 PHP 中生成完全的原生树

 

结构。

上面

Hello-World 的范例包括完整的 XML 格式。但它是无效的,因为既没有 DTD(文档类型定义)与其联系,

也没有内嵌

DTD  

对于

Expat,这并没有区别:Expat 是一个不检查有效性的解析器,因此忽略任何与文档联系的 DTD。但应注意