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 相关文章推荐
人大复印资料处理程序_补充篇
Oct 09 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
smarty简单分页的实现方法
Oct 27 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
PHP实现获取并生成数据库字典的方法
May 04 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
php微信开发之关注事件
Jun 14 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
Oct 15 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面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
PHP 递归效率分析
2009/11/24 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
javascript里的条件判断
2007/02/27 Javascript
基于jquery的表头固定的若干方法
2011/01/27 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
vuex实现简易计数器
2016/10/27 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
python使用循环实现批量创建文件夹示例
2014/03/25 Python
使用Python写一个量化股票提醒系统
2018/08/22 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Python 文件数据读写的具体实现
2020/01/24 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
python能自学吗
2020/06/18 Python
基于Python实现天天酷跑功能
2021/01/06 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
英国网上超市:Ocado
2020/03/05 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
2014元旦晚会策划方案
2014/02/19 职场文书
单位员工收入证明样本
2014/10/09 职场文书
合作意向协议书
2015/01/29 职场文书