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 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP 处理图片的类实现代码
Oct 23 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
Jul 02 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
Jul 03 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
Dec 29 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
php微信开发之谷歌测距
Jun 14 PHP
如何优雅的使用 laravel 的 validator验证方法
Nov 11 PHP
PHP+redis实现微博的推模型案例分析
Jul 10 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
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
Django通过json格式收集主机信息
2020/05/29 Python
pytorch实现查看当前学习率
2020/06/24 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
高级护理专业毕业生推荐信
2013/12/25 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
2015新学期家长寄语
2015/02/26 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
寒假致家长的一封信
2015/10/10 职场文书