php 基于事件的xml处理
php 有两种xml的处理方法:1.基于结构树的处理;2.基于事件的处理。今天介绍php 基于事件的xml处理。
先看下面一个例子:
先定义一个 test.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <note> <to>ZS</to> <from>Shexiao</from> <heading>Greeting</heading> <body>I miss you</body> </note>
再写一个 php_xml.php 文件处理 test.xml:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <?php $parser= xml_parser_create(); 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:"; break; } } function stop($parser,$element_name){ echo "<br>"; } function char($parser,$data){ echo $data; } xml_set_element_handler($parser, "start", "stop"); xml_set_character_data_handler($parser, "char"); $fp=fopen("test.xml","r"); while($data= fread($fp, 4096)){ 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))); } xml_parser_free($parser); ?> </body> </html>
运行这个文件,输出如下:
--NOTE--
TO:ZS
FROM:Shexiao
HEADING:Greeting
MESSAGE:I miss you
具体的工作流程:
a.先用 xml_parser_create() 初始化一个 xml 解析器;
b.定义几个函数来处理不同的事件,如上述代码中的start()函数,stop()函数和char()函数;
start()函数:遇到的开标签事件时调用;
stop()函数:遇到的闭标签事件时调用;
char()函数:遇到标签里面内容时调用;
c.用 xml_set_element_handler()设置遇到标签时处理的事件;
d.用xml_set_character_data_handler()设置遇到标签内容时处理的事件;
e.用fopen()打开test.xml文件都里面的内容;
f.用xml_parse()函数解析test.xml;
g.错误处理;
h.用xml_parser_free()来释放xml解析器的内存。