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生成随机数或者字符串的代码
Sep 05 PHP
php chr() ord()中文截取乱码问题解决方法
Sep 08 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
mysql总结之explain
Feb 27 PHP
php之XML转数组函数的详解
Jun 07 PHP
深入分析php中接口与抽象类的区别
Jun 08 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
PHP基于回溯算法解决n皇后问题的方法示例
Nov 07 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之对抗Web扫描器的脚本技巧
2008/10/01 PHP
php 购物车的例子
2009/05/04 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
详解js中==与===的区别
2017/01/08 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
python中stdout输出不缓存的设置方法
2014/05/29 Python
python中__slots__用法实例
2015/06/04 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
使用Python 统计高频字数的方法
2019/01/31 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
详解Python中的测试工具
2019/06/09 Python
python tkinter实现屏保程序
2019/07/30 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
浅析matlab中imadjust函数
2020/02/27 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
简述数据库的设计过程
2015/06/22 面试题
交通安全标语
2014/06/06 职场文书
意向书范本
2014/07/29 职场文书
平安家庭事迹材料
2014/12/20 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
Golang数据类型和相互转换
2022/04/12 Golang