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通过COM使用ADODB的简单例子
Dec 31 PHP
php图片验证码代码
Mar 27 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
纯php生成随机密码
Oct 30 PHP
php语言的7种基本的排序方法
Dec 28 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
Mar 15 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
Aug 17 PHP
yii2实现Ueditor百度编辑器的示例代码
Nov 02 PHP
PHP goto语句用法实例
Aug 06 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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
用libtemplate实现静态网页生成
2006/10/09 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
npm scripts 使用指南详解
2018/10/08 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
python进阶教程之异常处理
2014/08/30 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
白色公司:The White Company
2017/10/11 全球购物
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
农田水利实习自我鉴定
2013/09/19 职场文书
表彰大会策划方案
2014/05/13 职场文书
骨干教师事迹材料
2014/12/17 职场文书
2015入党自荐书范文
2015/03/05 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
Java 在线考试云平台的实现
2021/11/23 Java/Android