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