Expat解析器是一个基于事件的、非验证的、快速的XML解析器,它不是PHP扩展,而是PHP内置的XML解析核心引擎,SimpleXML和XMLReader等扩展都构建在它之上。
怎么理解这个解释器呢?
比如我们有一个xml数据:
<Dotcpp id="1">www.dotcpp.com</Dotcpp>
Expat解析器的执行步骤是先取“<Dotcpp id="1">”,通过一个回调函数处理起始标签;然后处理“www.dotcpp.com”文本内容;最后再通过一个回调函数处理“</Dotcpp>”。具体处理清空得看你回调函数怎么写了。

1. 通过 xml_parser_create()函数创建一个解释器。
2. 通过 xml_set_element_handler($parser, "startTag", "endTag")函数处理标签内属性(startTag 回调函数 → 处理开始标签名和标签属性;endTag 回调函数 → 处理结束标签)。
3. 通过 xml_set_character_data_handler($parser, "textData")函数处理标签内的值(textData回调函数处理标签之间的文本内容)。
简单来说,对于一个xml数据,Expat解析器会先处理第一个标签和属性,然后再处理标签间的文本内容,最后再处理结束标签,所有步骤都是通过回调函数来完成。
4. 这里举一个例子:
<?php
// 1. 创建解析器
$parser = xml_parser_create();
// 2. 设置基本的回调函数
xml_set_element_handler($parser, "startTag", "endTag");//选择解释器,设置起始标签和结束标签
xml_set_character_data_handler($parser, "textData");//处理文本函数
// 3. 定义简单的回调函数
function startTag($parser, $name, $attrs) {
// 获取属性在$attrs这个关联数组里
if (!empty($attrs)) {
echo " [属性: ";
foreach ($attrs as $key => $value) {
echo "$key='$value' ";
}
echo "]";
}
}
function endTag($parser, $name) {echo '<br>';}
function textData($parser, $data) {
$data = trim($data);
if (!empty($data)) {
echo $data;
}
}
// 4. 要解析的 XML
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<dotcpp>
<brand>Dotcpp编程</brand>
<website>dotcpp.com</website>
<course>PHP教程</course>
<courses>
<course id="1">PHP基础</course>
<course id="2">PHP高级</course>
<course id="3">PHP框架</course>
</courses>
</dotcpp>
XML;
// 5. 开始解析
xml_parse($parser, $xml);
// 6. 清理
xml_parser_free($parser);
?>访问test.php,我们会看到xml数据被我们的回调函数一一解析:

总结:通过Expat解析器,我们可以自由DIY我们想要的XML解析器!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程