作者:大自然
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。但应注意