这个函数需要三个参数:
解析器的实例
处理开始元素的回调函数的名称
处理结束元素的回调函数的名称
当开始解析
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()将最顶的元素