第二篇 XML 解析
我们这里开始说一下 XML 的解析技术,我在这里只针对 PHP 这种语言。现在主流的 XML 文档解析技术分为两种 :SAX 和 DOM 。
SAX(Simple API for XML), 它的技术实现原理很简单,解析器解析 XML 文档遍历所有标准的开始标记和结束标记。 PHP 手册中查 XML 第一种方法就是这种方法。该方法所有函数方法都是 php 的内置方法。
所有方法如下:
xml_error_string — 获取 XML 解析器的错误字符串 xml_get_current_byte_index — 获取 XML 解析器的当前字节索引 xml_get_current_column_number — 获取 XML 解析器的当前列号 xml_get_current_line_number — 获取 XML 解析器的当前行号 xml_get_error_code — 获取 XML 解析器错误代码 xml_parse_into_struct — 将 XML 数据解析到数组中 xml_parse — 开始解析一个 XML 文档 xml_parser_create_ns — 生成一个支持命名空间的 XML 解析器 xml_parser_create — 建立一个 XML 解析器 xml_parser_free — 释放指定的 XML 解析器 xml_parser_get_option — 从 XML 解析器获取选项设置信息 xml_parser_set_option — 为指定 XML 解析进行选项设置 xml_set_character_data_handler — 建立字符数据处理器 xml_set_default_handler — 建立默认处理器 xml_set_element_handler — 建立起始和终止元素处理器 xml_set_end_namespace_decl_handler — 建立终止命名空间声明处理器 xml_set_external_entity_ref_handler — 建立外部实体指向处理器 xml_set_notation_decl_handler — 建立注释声明处理器 xml_set_object — 在对象中使用 XML 解析器 xml_set_processing_instruction_handler — 建立处理指令( PI )处理器 xml_set_start_namespace_decl_handler — 建立起始命名空间声明处理器 xml_set_unparsed_entity_decl_handler — 建立未解析实体定义声明处理器 |
实现原理我大概说一下, SAX 的原来是通过处理事件进行工作。
第一步:创建解析器
|
第二步:启动处理器
XML 事件处理器有如下:
元素事件( Element events )将在 XML 解析器遇到标记符的起始符或者终止符时发生。另外,对于起始符和终止符也有独立的处理器。 | |
粗略的说,字符数据( Character data )是指 XML 文档中所有标记符以外的内容,包括标记符之间的空格。需要注意的是 XML 语法解析器不会加上或者去掉任何空格。空格的取舍将由应用程序(也就是你自己)来决定。 | |
PHP 程序员对 “ 处理指令 ” ( Processing Instructions , PI )应该已经很熟悉了。 <?php ?> 就是一个处理指令,其中 | |
所有无法被其它处理器处理的事件将由默认处理器来处理。这些事件包括诸如 XML 和文档类型声明等内容。 | |
该处理器将在遇到无法解析的实体名称( NDATA )声明时被调用。 | |
该处理器将在声明一个注释时被调用。 | |
当 XML 解析器遇到指向外部解析的一般实体名时,该处理器将被调用。该指向的目标可以是一个文件,也可以是 URL 。请参阅 “外部实体名范例 ” 。 |
(以上方法信息摘自 php 手册)
这里对一个处理器进行一下说明:
|
设置触发方法 start_handler 和 end_handler
|
执行 xml_parse 方法开始解析,调用触发方法
|
最后一定要释放 XML 解析器
|
用 SAX 解析 XML 有许多工作要做,这种方法我认为比较麻烦 , 不推荐。
再说说 DOM(Document Object Model) 方法,它就要简单很多。它通过遍历对象文件,在内存中建立结构树, 可以通过递归遍历所有子节点。但是消耗内存,在第一篇中我已经提过了。
由于 DOM XML 方法过多,我就不一一写下来了,可以去 PHP 手册中查找。
我只对几个重要的方法进行简单的例子描述:
$dom = new DomDocument(); // 实例化一个 DomDocument 对象
// 不论是读取 XML 还是创建一个 XML 都需要实例化 DomDocument 对象
先说读取 XML
|
通过 foreach 遍历 $children 对象,获得所有 node 节点。根据所有 node 节点的类型,进行不同处理。
创建 XML
|
除了使用 DOM XML 方法操作 XML 结构外, PHP 还提供了 SimpleXML 扩展,用于读写 XML 的应用程序编程接口( API ),它也是使用 DOM 的方法。
它通过 $doc->rss->channel->item->title 的表达式方式进行操作极为简单。
除了上述的 3 种方法外, PEAR 下还有解析 DOM 的其他扩展。如: XML_TREE XML_RSS..