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 相关文章推荐
PHP下MAIL的另一解决方案
Oct 09 PHP
php截取字符串函数分享
Feb 02 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
简单解析PHP程序的运行流程
Jun 23 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
php cookie用户登录的详解及实例代码
Jan 03 PHP
php批量删除操作代码分享
Feb 26 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
PHP判断是否是json字符串
Apr 01 PHP
PHP解决高并发问题
Apr 01 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
献给php初学者(入门学习经验谈)
2010/10/12 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
Python异常处理例题整理
2019/07/07 Python
会计演讲稿范文
2014/05/23 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
python 爬取华为应用市场评论
2021/05/29 Python
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
java开发双人五子棋游戏
2022/05/06 Java/Android