background image

 

这个函数需要三个参数:

  

解析器的实例

  

处理开始元素的回调函数的名称

  

处理结束元素的回调函数的名称
当开始解析

XML 文档时,回调函数必须存在。它们必须定义为与 PHP

 

手册中所描述的原型一致。

例如,

Expat

 

将三个参数传递给开始元素的处理函数。在脚本范例中,其定义如下:

function start_element($parser, $name, $attrs)  

 

第一个参数是解析器标示,第二个参数是开始元素的名称,第三参数为包含元素所有属性和值的数组。

一旦你开始解析

XML 文档,Expat 在遇到开始元素是都将调用你的 start_element()函数并将参数传递过去。 

XML 的 Case Folding

 

选项

xml_parser_set_option()函数将 Case folding 选项关闭。这个选项默认是打开的,使得传递给处理函

数的元素名自动转换为大写。但

XML 对大小写是敏感的(所以大小写对统计 XML 文档是非常重要的)。对于我们

的范例,

case folding

 

选项必须关闭。

 

解析文档

在完成所有的准备工作后,现在脚本终于可以解析

XML

 

文档:

Xml_parse_from_file(),一个自定义的函数,打开参数中指定的文件,并以 4kb

  

的大小进行解析

xml_parse()和 xml_parse_from_file()一样,当发生错误时,即 XML 文档的格式不完全时,将会返回
false   

你可以使用

xml_get_error_code()函数来得到最后一个错误的数字代码。将此数字代码传递给

xml_error_string()

  

函数即可得到错误的文本信息。

输出

XML

  

当前的行数,使得调试更容易。

  

在解析的过程中,调用回调函数。

 

描述文档结构

当解析文档时,对于

Expat

 

需要强调问题的是:如何保持文档结构的基本描述?

 

如前所述,基于事件的解析器本身并不产生任何结构信息。

不过标签

(tag)结构是 XML 的重要特性。例如,元素序列<book><title>表示的意思不同于

<figure><title>。也就是说,任何作者都会告诉你书名和图名是没有关系的,虽然它们都用到"title"这个
术语。因此,为了更有效地使用基于事件的解析器处理

XML,你必须使用自己的栈(stacks)或列表(lists)来

 

维护文档的结构信息。

为了产生文档结构的镜像,脚本至少需要知道目前元素的父元素。用

Exapt 的 API 是无法实现的,它只报告目前

 

元素的事件,而没有任何前后关系的信息。因此,你需要建立自己的栈结构。

脚本范例使用先进后出

(FILO)的栈结构。通过一个数组,栈将保存全部的开始元素。对于开始元素处理函数,目

前的元素将被

array_push()函数推到栈的顶部。相应的,结束元素处理函数通过 array_pop()将最顶的元素