面 向 PHP
开发 人员 的 XML
, 第 2 部分:
高级 XML 解析技
术
XML
和 PHP5
可扩展标记语言(Extensible Markup Language,XML)不仅被看作是一种标记语言,
而且是一种基于文本的数据存储格式,它提供了基于文本的方法来应用和描述信息的树
状结构。
PHP5
提供了一些全新的和重新编写的 XML
解析扩展。其中包括将整个 XML 文档加载到
内存中的 SimpleXML、DOM
和 XSLT
处理程序。也有每次把 XML 文档的一部分加载到内
存中的 Simple API for XML (SAX)
和 XMLReader。SAX
的功能和在 PHP4 中没有变化,
但不再以 expat
库为基础而改用了 libxml2
库。如果通过其他语言熟悉了 DOM,则与以
前的版本相比,在 PHP5
中使用 DOM 编程将简单得多。
XML 解析基础
解析 XML
有两种基本的方式:树和流。树解析方式需要将整个 XML 文档加载到内存中。
树文件结构允许随机访问文档元素和编辑 XML
。树型解析的例子包括 DOM 和
SimpleXML。这些解析器都在内存中以不同但可互操作的格式共享树状结构。和树解析方
式不同,流解析不需要将整个文档加载到内存中。这里的流和流音频中的流意思很相近。
其用途和目的都一样,就是每次提交少量数据以节约带宽和内存。在流解析中,只能访问
当前解析的节点,并且不能将 XML 作为一个文档来编辑。流解析器的例子包括
XMLReader
和 SAX。
基于树的解析器
之所以称为基于树的解析器,是因为它们将整个 XML 文档加载到内存中,并把文档的根
作为主干,把所有的儿子、孙子和它们的后代以及属性作为分支。最熟悉的基于树的解析
器是 DOM
。编码最简单的基于树的解析器是 SimpleXML。后面对两者都将作出介绍。
使用 DOM 解析
根据 W3C 的定义,DOM
“……
标准是
一种平台和语言中立的接口,能够让程序和脚本
”
动态地访问和更新文档的内容、结构和样式。 GNOME
项目的 libxml2
库用 C 实现了
DOM
及其全部方法。因为所有的 PHP5 XML
扩展都基于 libxml2,所以彼此之间具有完
全的互操作性。这种互操作性大大增强了它们的功能。比方说,可以使用流解析器
XMLReader
获取一个元素,将其导入 DOM
,然后用 XPath 提取数据。这就大大增加了
灵活性。
DOM 是基于树的解析器。DOM
很容易理解和使用,因为其内存结构与原始 XML 文档相
似。DOM
通过创建对象树来向应用程序传递信息,它完全复制了 XML 文件的元素树,每
个 XML 元素都是树上的一个节点。DOM
是一种 W3C 标准,由于和其他编程语言的一致
性,对于开发人员来说,为 DOM
增加了不少权威性。因为 DOM 要创建整个文档的树,
要占用大量内存和处理器时间。
使用 DOM
如果由于受设计或者其他因素的限制必须在解析器领域内耍点小聪明的话,则仅仅从灵
活的角度来看应该选择 DOM
。使用 DOM
可以构建、修改、查询、验证和转换 XML 文档。可
以利用所有的 DOM
方法和属性。多数 DOM level 2 方法的实现都有适当的属性支持。由
于非凡的灵活性,使用 DOM 可以解析任意复杂的文档。但是要记住,如果要把很大的
XML 文档一次加载到内存中,则取得灵活性的代价相当高昂。