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 相关文章推荐
模仿OSO的论坛(四)
Oct 09 PHP
PHP 代码规范小结
Mar 08 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
php设计模式之命令模式使用示例
Mar 02 PHP
PHP程序漏洞产生的原因分析与防范方法说明
Mar 06 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
PHP使用MPDF类生成PDF的方法
Dec 08 PHP
Yii中表单用法实例详解
Jan 05 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
浅谈PHP的反射机制
Dec 15 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
Oct 14 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利用str_replace防注入的方法
2013/11/10 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
php显示时间常用方法小结
2015/06/05 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
Mootools 1.2教程 输入过滤第二部分(字符串)
2009/09/15 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
python爬取51job中hr的邮箱
2016/05/14 Python
python中调试或排错的五种方法示例
2019/09/12 Python
keras输出预测值和真实值方式
2020/06/27 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
微信营销策划方案
2014/02/24 职场文书
大学军训感言600字
2014/02/25 职场文书
降消项目实施方案
2014/03/30 职场文书
国企干部对照检查材料
2014/08/22 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书