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 10 PHP
PHP 组件化编程技巧
Jun 06 PHP
深入Nginx + PHP 缓存详解
Jul 11 PHP
深入解析php中的foreach函数
Aug 31 PHP
php简单的留言板与回复功能具体实现
Feb 19 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
Nov 12 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
CI配置多数据库访问的方法
Mar 28 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
php微信公众平台开发(四)回复功能开发
Dec 06 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 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生成xml简单实例代码
2009/12/16 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
php中namespace use用法实例分析
2016/01/22 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
详解js类型判断
2018/05/22 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
python模拟实现斗地主发牌
2020/01/07 Python
keras输出预测值和真实值方式
2020/06/27 Python
前厅部经理岗位职责范文
2014/02/04 职场文书
终止合同协议书
2014/04/17 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
员工表扬信怎么写
2015/05/05 职场文书
庆七一活动简报
2015/07/20 职场文书
初三毕业感言
2015/07/31 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
创业计划书之面包店
2019/09/12 职场文书
python编写五子棋游戏
2021/05/25 Python
MySQL里面的子查询的基本使用
2021/08/02 MySQL
Python3.10的一些新特性原理分析
2021/09/15 Python