php-XML Expat 解析器

有两种基本的 XML 解析器类型:
基于树的解析器:这种解析器把 XML 文档转换为树型结构。它分析整篇文档,并提供了对树中元素的访问,例如文档对象模型 (DOM)。
基于事件的解析器:将 XML 文档视为一系列的事件。当某个具体的事件发生时,解析器会调用函数来处理。
Expat 解析器是基于事件的解析器。

<?php
// 通过 xml_parser_create() 函数初始化 XML 解析器
$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:";
    }
}

function stop($parser,$element_name){
	echo "<br>";
}

function char($parser,$data){
	echo $data;
}
// 添加 xml_set_element_handler() 函数来定义,当解析器遇到开始和结束标签时执行哪个函数
xml_set_element_handler($parser,"start","stop");
// 添加 xml_set_character_data_handler() 函数来定义,当解析器遇到字符数据时执行哪个函数
xml_set_character_data_handler($parser,"char");
//打开xml文件
$fp=fopen("test.xml","r");
// 通过 xml_parse() 函数来解析文件 "test.xml"
// 万一有错误的话,添加 xml_error_string() 函数把 XML 错误转换为文本说明
while($data=fread($fp,4096)){
	//feof() 函数检测是否已到达文件末尾 (eof)
	xml_parse($parser,$data,feof($fp)) or die(sprintf("XML Errpr:%s at line %d",xml_error_string(xml_get_error_code($parser)),xml_get_current_line_number($parser)));
}
// 调用 xml_parser_free() 函数来释放分配给 xml_parser_create() 函数的内存 
xml_parser_free($parser);
?>
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注