什么是Expat?
如需读取和更新-创建创建并处理-一个XML文档
,您需要XML解析器
。 有两种基本的XML解析器类型:
基于树的解析器:这种解析器把XML文档转换为树型结构
。它分析整篇文档
,并提供了API来访问树种的元素,例如文档对象模型(DOM)。
基于事件的解析器:将XML文档视为一系列的事件。当某个具体的事件发生时,解析器会调用函数来处理。
Expat解析器是基于事件的解析器。
基于事件的解析器集中在XML文档的内容,而不是它们的结果。正因如此,基于事件的解析器能够比基于树的解析器更快地访问数据。
请看下面的XML片段:
<from>John</from>基于事件的解析器把上面的XML报告为一连串的三个事件:
开始元素:from
开始CDATA部分,值:John
关闭元素:from
上面的XML范例包含了形式良好的XML。不过这个例子是无效的XML,因为没有与它关联的文档类型声明(DTD),也没有内嵌的DTD。
不过,在使用Expat解析器时,这没有区别。Expat是不检查有效性的解析器,忽略任何DTD。
作为一款基于事件、非验证的XML解析器,Expat快速且轻巧,十分适合
PHP的web应用程序。
注释:XML文档必须形式良好,否则Expat会生成错误。
安装
XMLExpat解析器是
PHP核心的组成部分。无需安装就可以使用这些函数。
XML文件
将在我们的例子中使用下面的XML文件:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don'tforgetthemeeting!</body>
</note>初始化XML解析器
我们要在PHP中初始化XML解析器,为不同的XML事件定义处理器,然后解析这个XML文件。
例子
<?php
//InitializetheXMLparser
$parser=xml_parser_create();
//Functiontouseatthestartofanelement
functionstart($parser,$element_name,$element_attrs)
{
switch($element_name)
{
case"NOTE":
echo"--Note--<br/>";
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"<br/>";
}
//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()函数的内存