1、基本XML解析器类型
(1)、基于树型的解析器
说明:这种解析器把 XML 文档转换为树型结构。它分析整篇文档,并提供API 来访问树中的元素。例如文档对象模型 (DOM)。
(2)、基于事件的解析器

说明:将 XML 文档视为一系列的事件。当某个具体的事件发生时,解析器会调用函数来处理。

2、什么是 Expat?
前言:如需读取和更新(创建并处理)XML 文档,您需要 XML 解析器。
说明:Expat 解析器是基于事件的解析器。基于事件的解析器集中在 XML 文档的内容,而不是它们的结果。正因如此,基于事件的解析器能够比基于树的解析器更快地访问数据。

3、解析实例

(1)、XML文件

<span style="font-size:18px;"><?xml version="1.0" encoding="ISO-8859-1"?>
<note>
	<to>cyb</to>
	<from>tl</from>
	<heading>Reminder</heading>
	<body>Don't forget the meeting!</body>
</note></span>



(2)、初始化XML解析器

前言:要在 PHP 中初始化 XML 解析器,为不同的 XML 事件定义处理器,然后解析这个 XML 文件。


<span style="font-size:18px;"><?php
	///1、初始化解析器
	$parser=xml_parser_create();

	///2、事件函数
	// 元素开始函数
	function start($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: ";
	  }
	}

	// 元素结束函数
	function stop($parser,$element_name)
	{
		echo "<br />";
	}

	// 数据处理函数
	function char($parser,$data)
	{
		echo $data;
	}

	///3、事件监听
	// 指定元素监听
	xml_set_element_handler($parser,"start","stop");

	// 指定数据监听
	xml_set_character_data_handler($parser,"char");

	///4、 打开XML文件
	$fp=fopen("test.xml","r");

	///5、 读取XML数据
	while ($data=fread($fp,4096))
	{
		/// 6、解析
		xml_parse($parser,$data,feof($fp)) or 
		die (sprintf("XML Error: %s at line %d",  xml_error_string(xml_get_error_code($parser)),xml_get_current_line_number($parser)));
	}

	///7、释放解析器
	xml_parser_free($parser);

?></span>


(3)、结果输出

-- Note --

To: George

From: John

Heading: Reminder

Message: Don't forget the meeting!

(4)、工作原理

通过 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() 函数的内存;