快速业务通道

php的xml分析函数

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-25
解析文档前,基于事件的解析器通常要求你注册回调函数-用于特定的事件发生时调用。Expat没有例外事件,它定义了如下七个可能事件:

对象 XML解析函数 描述

元素 xml_set_element_handler() 元素的开始和结束

字符数据 xml_set_character_data_handler() 字符数据的开始

外部实体 xml_set_external_entity_ref_handler() 外部实体出现

未解析外部实体 xml_set_unparsed_entity_decl_handler() 未解析的外部实体出现

处理指令 xml_set_processing_instruction_handler() 处理指令的出现

记法声明 xml_set_notation_decl_handler() 记法声明的出现

默认 xml_set_default_handler() 其它没有指定处理函数的事件

所有的回调函数必须将解析器的实例作为其第一个参数(此外还有其它参数)。

对于本文最后的范例脚本。你需要注意的是它既用到了元素处理函数又用到了字符数据处理函数。元素的回调处理函数通过xml_set_element_handler()来注册。

这个函数需要三个参数:

解析器的实例 
处理开始元素的回调函数的名称 
处理结束元素的回调函数的名称 
当开始解析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()将最顶的元素移走。

对于序列<book><title></title></book>,栈的填充如下:

开始元素book:将"book"赋给栈的第一个元素($stack[0])。 
开始元素title:将"title

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号