Expat解析器是一个基于事件的、非验证的、快速的XML解析器,它不是PHP扩展,而是PHP内置的XML解析核心引擎,SimpleXML和XMLReader等扩展都构建在它之上。

怎么理解这个解释器呢?

比如我们有一个xml数据:

<Dotcpp id="1">www.dotcpp.com</Dotcpp>

Expat解析器的执行步骤是先取“<Dotcpp id="1">”,通过一个回调函数处理起始标签;然后处理“www.dotcpp.com”文本内容;最后再通过一个回调函数处理“</Dotcpp>”。具体处理清空得看你回调函数怎么写了。

Expat解析器

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解析器

总结:通过Expat解析器,我们可以自由DIY我们想要的XML解析器!

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)