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生成WAP页面
Oct 09 PHP
第三章 php操作符与控制结构代码
Dec 30 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
php使用curl详细解析及问题汇总
Aug 11 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
Mar 14 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
Laravel 前端资源配置教程
Oct 18 PHP
详解phpstorm2020最新破解方法
Sep 17 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+mysql 实现身份验证代码
2010/03/24 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
jQuery 处理页面的事件详解
2015/01/20 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
Python列表推导式的使用方法
2013/11/21 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
详解python中eval函数的作用
2019/10/22 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
英文版餐饮业求职信
2013/10/18 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
海飞丝的广告词
2014/03/20 职场文书
运动会标语
2014/06/21 职场文书
委托书怎么写
2014/07/31 职场文书
交通事故委托书范本
2014/09/28 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫