PHP XML Expat解析器知识点总结


Posted in PHP onFebruary 15, 2019

内建的 Expat 解析器使在 PHP 中处理 XML 文档成为可能。

什么是 XML?

XML 用于描述数据,其焦点是数据是什么。XML 文件描述了数据的结构。

在 XML 中,没有预定义的标签。您必须定义自己的标签。

什么是 Expat?

如需读取和更新 - 创建创建并处理 - 一个 XML 文档,您需要 XML 解析器。

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

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

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

基于事件的解析器集中在 XML 文档的内容,而不是它们的结果。正因如此,基于事件的解析器能够比基于树的解析器更快地访问数据。

请看下面的 XML 片段:

<from>John</from>

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

  • 开始元素:from
  • 开始 CDATA 部分, 值:John
  • 关闭元素: from

上面的 XML 范例包含了形式良好的 XML。不过这个例子是无效的 XML,因为没有与它关联的文档类型声明 (DTD),也没有内嵌的 DTD。

不过,在使用 Expat 解析器时,这没有区别。Expat 是不检查有效性的解析器,忽略任何 DTD。

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

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

安装

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

XML 文件

将在我们的例子中使用下面的 XML 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

初始化 XML 解析器

我们要在 PHP 中初始化 XML 解析器,为不同的 XML 事件定义处理器,然后解析这个 XML 文件。

例子

<?php

//Initialize the XML parser
$parser=xml_parser_create();

//Function to use at the start of an element
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 to use at the end of an element
function stop($parser,$element_name)
 {
 echo "<br />";
 }

//Function to use when finding character data
function char($parser,$data)
 {
 echo $data;
 }

//Specify element handler
xml_set_element_handler($parser,"start","stop");

//Specify data handler
xml_set_character_data_handler($parser,"char");

//Open XML file
$fp=fopen("test.xml","r");

//Read data
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)));
 }

//Free the XML parser
xml_parser_free($parser);

?>

以上代码的输出:

-- Note --
To: George
From: John
Heading: Reminder
Message: Don't forget the meeting!

工作原理解释:

  • 通过 xml_parser_create() 函数初始化 XML 解析器
  • 创建配合不同事件处理程序的的函数
  • 添加 xml_set_element_handler() 函数来定义,当解析器遇到开始和结束标签时执行哪个函数
  • 添加 xml_set_character_data_handler() 函数来定义,当解析器遇到字符数据时执行哪个函数
  • 通过 xml_parse() 函数来解析文件 "test.xml"
  • 万一有错误的话,添加 xml_error_string() 函数把 XML 错误转换为文本说明
  • 调用 xml_parser_free() 函数来释放分配给 xml_parser_create() 函数的内存
PHP 相关文章推荐
PHP5中的this,self和parent关键字详解教程
Mar 19 PHP
PHP5中使用PDO连接数据库的方法
Aug 01 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
Oct 16 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
php进程间通讯实例分析
Jul 11 PHP
php中this关键字用法分析
Dec 07 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
thinkPHP事务操作简单案例分析
Oct 17 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 #PHP
PHP fopen函数用法实例讲解
Feb 15 #PHP
PHP fclose函数用法总结
Feb 15 #PHP
PHP filesize函数用法浅析
Feb 15 #PHP
PHP数组遍历的几种常见方式总结
Feb 15 #PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
Feb 15 #PHP
PHP crypt()函数的用法讲解
Feb 15 #PHP
You might like
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
vue中监听返回键问题
2019/08/28 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
简单使用Python自动生成文章
2014/12/25 Python
Python文件和目录操作详解
2015/02/08 Python
python3简单实现微信爬虫
2015/04/09 Python
Python实现的双色球生成功能示例
2017/12/18 Python
python实现读取大文件并逐行写入另外一个文件
2018/04/19 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
办公室内勤工作职责
2013/12/11 职场文书
高中军训感言800字
2014/03/05 职场文书
员工开除通知书
2015/04/25 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
小学见习报告
2015/06/23 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Java实现房屋出租系统详解
2021/10/05 Java/Android
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js
vue使用watch监听属性变化
2022/04/30 Vue.js