PHP XML Expat解析器知识点总结
内建的Expat解析器使在PHP中处理XML文档成为可能。
什么是XML?
XML用于描述数据,其焦点是数据是什么。XML文件描述了数据的结构。
在XML中,没有预定义的标签。您必须定义自己的标签。
什么是Expat?
如需读取和更新-创建创建并处理-一个XML文档,您需要XML解析器。
有两种基本的XML解析器类型:
- 基于树的解析器:这种解析器把XML文档转换为树型结构。它分析整篇文档,并提供了API来访问树种的元素,例如文档对象模型(DOM)。
- 基于事件的解析器:将XML文档视为一系列的事件。当某个具体的事件发生时,解析器会调用函数来处理。
Expat解析器是基于事件的解析器。
基于事件的解析器集中在XML文档的内容,而不是它们的结果。正因如此,基于事件的解析器能够比基于树的解析器更快地访问数据。
请看下面的XML片段:
John
基于事件的解析器把上面的XML报告为一连串的三个事件:
- 开始元素:from
- 开始CDATA部分,值:John
- 关闭元素:from
上面的XML范例包含了形式良好的XML。不过这个例子是无效的XML,因为没有与它关联的文档类型声明(DTD),也没有内嵌的DTD。
不过,在使用Expat解析器时,这没有区别。Expat是不检查有效性的解析器,忽略任何DTD。
作为一款基于事件、非验证的XML解析器,Expat快速且轻巧,十分适合PHP的web应用程序。
注释:XML文档必须形式良好,否则Expat会生成错误。
安装
XMLExpat解析器是PHP核心的组成部分。无需安装就可以使用这些函数。
XML文件
将在我们的例子中使用下面的XML文件:
George John Reminder Don'tforgetthemeeting!
初始化XML解析器
我们要在PHP中初始化XML解析器,为不同的XML事件定义处理器,然后解析这个XML文件。
例子
"; break; case"TO": echo"To:"; break; case"FROM": echo"From:"; break; case"HEADING": echo"Heading:"; break; case"BODY": echo"Message:"; } } //Functiontouseattheendofanelement functionstop($parser,$element_name) { echo"
"; } //Functiontousewhenfindingcharacterdata functionchar($parser,$data) { echo$data; } //Specifyelementhandler xml_set_element_handler($parser,"start","stop"); //Specifydatahandler xml_set_character_data_handler($parser,"char"); //OpenXMLfile $fp=fopen("test.xml","r"); //Readdata while($data=fread($fp,4096)) { xml_parse($parser,$data,feof($fp))or die(sprintf("XMLError:%satline%d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); } //FreetheXMLparser xml_parser_free($parser); ?>
以上代码的输出:
--Note--
To:George
From:John
Heading:Reminder
Message:Don'tforgetthemeeting!
工作原理解释:
- 通过xml_parser_create()函数初始化XML解析器
- 创建配合不同事件处理程序的的函数
- 添加xml_set_element_handler()函数来定义,当解析器遇到开始和结束标签时执行哪个函数
- 添加xml_set_character_data_handler()函数来定义,当解析器遇到字符数据时执行哪个函数
- 通过xml_parse()函数来解析文件"test.xml"
- 万一有错误的话,添加xml_error_string()函数把XML错误转换为文本说明
- 调用xml_parser_free()函数来释放分配给xml_parser_create()函数的内存