PHP XML Expat 解析器

PHP 内建的 Expat 解析器可以处理 XML 文档

PHP XML Expat 解析器函数是 PHP 核心的组成部分,无需安装就可以使用这些函数

XML 是什么?

XML 用于描述数据,其焦点是数据是什么

XML 文件描述了数据的结构

XML 没有预定义的标签,我们必须定义自己的标签

如果想要学习更多 XML 的知识,请访问我们的 XML 基础教程

Expat 是什么?

如需读取和更新 、创建和处理、一个 XML 文档,我们需要 XML 解析器

有两种基本的 XML 解析器类型:

  1. 基于树的解析器

    这种解析器把 XML 文档转换为树型结构

    它分析整篇文档,并提供了对树中元素的访问,例如文档对象模型 ( DOM )

  2. 基于事件的解析器

    将 XML 文档视为一系列的事件

    当某个具体的事件发生时,解析器会调用函数来处理

事件解析器

PHP Expat 解析器是基于事件的解析器

基于事件的解析器集中在 XML 文档的内容,而不是它们的结构

也正因为如此,基于事件的解析器能够比基于树的解析器更快地访问数据

比如下面的 XML 片段

<from>小红</from>

基于事件的解析器把上面的 XML 报告为一连串的三个事件

  1. 开始元素:from
  2. 开始 CDATA 部分,值:小红
  3. 关闭元素:from

上面的 XML 范例包含了形式良好的 XML

不过这个范例是无效的 XML,因为没有与它关联的文档类型声明 (DTD)

但 Expat 不关注这些,Expat 是不检查有效性的解析器,忽略任何 DTD

作为一款基于事件、非验证的 XML 解析器,Expat 快速且轻巧,十分适合 PHP 的 Web 应用程序

注意: XML 文档必须形式良好,否则 Expat 会生成错误

XML 文件

首先我们创建一个 XML 文件 php_xml_note.xml ,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>小明</to>
<from>小红</from>
<heading>短信</heading>
<body>I miss you so much</body>
</note>

初始化 XML 解析器

使用 Expat 解析 XML 需要先初始化 XML 解析器,为不同的 XML 事件定义处理器,然后解析这个 XML 文件

php_xml_expat.php

<?php

//初始化 XML 解析器

$parser = xml_parser_create();

// 处理 XML 元素的开始
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: ";
    }
}

// 处理 XML 元素的结束

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

// 处理 XML CDATA 数据

function char($parser,$data)
{
    echo $data;
}

// 添加 XML 处理器

xml_set_element_handler($parser,"start","stop");

// 添加 XML CDATA 处理器
xml_set_character_data_handler($parser,"char");

//打开 XML 文档

$fp=fopen("php_xml_note.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);

?>

运行范例 »

运行以上范例,输出结果如下

PHP Expat 处理流程

  1. 通过 xml_parser_create() 函数初始化 XML 解析器
  2. 创建配合不同事件处理程序的的函数
  3. 添加 xml_set_element_handler() 函数来定义,当解析器遇到开始和结束标签时执行哪个函数
  4. 添加 xml_set_character_data_handler() 函数来定义,当解析器遇到字符数据时执行哪个函数
  5. 通过 xml_parse() 函数来解析文件 "test.xml"
  6. 万一有错误的话,添加 xml_error_string() 函数把 XML 错误转换为文本说明
  7. 调用 xml_parser_free() 函数来释放分配给 xml_parser_create() 函数的内存

延伸阅读

如果想学习更多 PHP Expat 提供的函数,请访问我们的 PHP XML Parser 函数参考手册

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.