17.5.5 完整实例分析
前面4小节介绍了分析XML的主要函数,这小节将通过一个具体实例使读者了解这些函数在PHP程序中的具体用法。这小节使用的XML文档就是在17.2小节创建的17-1.xml。
这节的实例程序将首先在PHP程序中初始化XML分析器,然后为不同的XML事件定义不同的处理器,最后分析XML文档。代码17-2是这个完整程序,如下所示。
代码17-2 使用Expat函数处理XML文档17-2.php
01 <?php
02 $parser=xml_parser_create();//初始化XML分析器
03
04 function start($parser,$elem_name,$elem_attrs)//在一个元素开始时调用的函数
05 {
06 switch($elem_name)
07 {
08 case"BOOKS":
09 echo"<b>--图书信息--</b><br/><br/>";
10 break;
11 case"TITLE":
12 echo"<b>书名:</b>";
13 break;
14 case"AUTHOR":
15 echo"<b>作者:</b>";
16 break;
17 case"PUBLISHER":
18 echo"<b>出版社:</b>";
19 break;
20 case"PRICE":
21 echo"<b>价格:</b>";
22 break;
23 }
24 }
25
26 function stop($parser,$elem_name)//在一个元素结束时调用的函数
27 {
28 echo"<br/>";
29 }
30
31 function char($parser,$data)//当找到一个字符数据时调用该函数
32 {
33 echo$data;
34 }
35
36
37 xml_set_element_handler($parser,"start","stop");//指定元素处理器
38 xml_set_character_data_handler($parser,"char");//指定字符数据处理器
39
40 $fp=fopen("17-1.xml","r");//打开XML文件
41 while($data=fread($fp,1024))//循环读入XML文件中的内容
42 {
43 xml_parse($parser,$data,feof($fp))or
44 die(sprintf("XML错误:%s at line%d",
45 xml_error_string(xml_get_error_code($parser)),
46 xml_get_current_line_number($parser)));
47 }
48
49 xml_parser_free($parser);//释放XML分析器资源
50 ?>
这段代码的执行结果如图17.7所示。
【代码解析】下面对代码17-2的各个关键点加以解释。代码第2行,使用函数xml_parser_create()初始化一个XML分析器。代码第4行,建立函数star()用来当XML分析器找到一个元素开始时调用,这个函数内部通过判断作为参数传入的元素名称,来显示不同的文字。注意,判断元素名称时,元素名称用大写字母,无论XML文档中使用的是否是大写或小写字母。代码第26行,定义函数stop()在一个元素结束时调用,该函数仅仅用来向页面输出换行。代码第31行,定义函数char()在XML分析器找到一个字符数据时调用,该函数向页面输出这个字符数据。
接下来的代码就是实际的PHP处理XML函数。代码第37行,使用函数xml_set_element_handler()指定元素处理器,其第2个参数,就是代码第4行定义函数的名称start,以字符串形式传入函数xml_set_element_handler()。其第3个参数就是第26行定义的函数名称stop,同样是以字符串形式将函数名称“stop”传入函数xml_set_element_handler()。这样,当函数xml_set_element_handler()在处理XML元素开始和结束部分的时候就会分别调用程序自定义的函数start()和stop()。
代码第38行使用函数xml_set_character_data_handler()指定字符数据的XML处理器。同理,该函数也使用了自定义函数char()的名称“char”作为其第2个参数,这样当分析到一个XML字符数据时,就会调用函数char()来输出该字符数据。
代码第40行使用函数fopen()打开XML文件17-1.xml,接着在第43行调用函数xml_parse()分析读入的XML数据。同时,在分析XML出现错误时调用函数xml_error_string()和xml_get_current_line_number()分别获取错误信息和错误所在行。代码最后使用函数xml_parser_free()释放程序开始建立的XML分析器实例。
共有条评论 网友评论