欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP XML Expat解析器知识点总结

程序员文章站 2022-06-20 20:16:56
内建的 expat 解析器使在 php 中处理 xml 文档成为可能。 什么是 xml? xml 用于描述数据,其焦点是数据是什么。xml 文件描述了数据的结构...

内建的 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() 函数的内存