PHP的XML分析函数
[2003-03-15 20:45:45]
[显亮
源代码]
适合的阅读对象
本文适合于打算用XML编写程序的有经验PHP程序员。本文假设你熟悉XML的语法和优点。
如果读者希望
学习更多的XML知识,在阅读本文以前应浏览以下网站:
What is XML? - 由Normal Walsh撰写XML介绍
XML FAQ -XML - 常见问题
Project Cool: XML resources - XML指南和参考
XML - XML入门网站
XML.org - XML的连接网站
Annotated XML specification - W3C的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文档范例:
Hello World
基于事件的解析器将
报告为三个事件:
开始元素:greeting
CDATA项的开始,值为:Hello World
结束元素:greeting
不像基于树型的解析器,基于事件的解析器不产生描述文档的结构。在CDATA项中,基于事件的解析器
不会让你得到父元素greeting的信息。
然而,它提供一个更底层的访问,这就使得可以更好地利用资源和更快地访问。通过这种方式,就没
有必要将整个文档放入内存;而
事实上,整个文档甚至可以大于实际内存值。
Expat就是这样的一种基于事件的解析器。当然如果使用Expat,必要时它一样可以在PHP中生成完全的
原生树结构。
上面Hello-World的范例包括完整的XML格式。但它是无效的,因为既没有DTD(文档类型定义)与其联
系,也没有内嵌DTD。
对于Expat,这并没有区别:Expat是一个不检查有效性的解析器,因此忽略任何与文档联系的DTD。但
应注意的是文档仍然需要完整的格式,否则Expat(和其他符合XML标准的解析器一样)将会随着出错
信息而停止。
作为不检查有效性的解析器,Exapt的快速性和轻巧性使其十分适合互联网程序。
编译Expat
Expat可以编译进PHP3.0.6版本(或以上)中。从Apache1.3.9开始,Expat已经作为Apache的一部分。
在Unix
系统中,通过-with-xml选项配置PHP,你可以将其编译入
PHP。
如果你将PHP编译为Apache的模块,而Expat将默认作为Apache的一部分。在Windows中,你则必须要加
载XML动态连接库。
XML范例:XMLstats
了解Expat的函数的一个办法就是通过范例。我们所要讨论的范例是使用Expat来收集XML
文档的统计