PHP中XML通信应用(二 XML解析)

第二篇   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  xml_parser_create ();

 

第二步:启动处理器

XML 事件处理器有如下:

xml_set_element_handler()

元素事件( Element events )将在 XML 解析器遇到标记符的起始符或者终止符时发生。另外,对于起始符和终止符也有独立的处理器。

xml_set_character_data_handler()

粗略的说,字符数据( Character data )是指 XML 文档中所有标记符以外的内容,包括标记符之间的空格。需要注意的是 XML 语法解析器不会加上或者去掉任何空格。空格的取舍将由应用程序(也就是你自己)来决定。

xml_set_processing_instruction_handler()

PHP 程序员对 处理指令 Processing Instructions PI )应该已经很熟悉了。 <?php ?> 就是一个处理指令,其中 php 被称为 “PI target” 。除了以 “XML” 开头的 PI target 已被保留以外,对这些 PI 的处理将由应用程序来完成。

xml_set_default_handler()

所有无法被其它处理器处理的事件将由默认处理器来处理。这些事件包括诸如 XML 和文档类型声明等内容。

xml_set_unparsed_entity_decl_handler()

该处理器将在遇到无法解析的实体名称( NDATA )声明时被调用。

xml_set_notation_decl_handler()

该处理器将在声明一个注释时被调用。

xml_set_external_entity_ref_handler()

XML 解析器遇到指向外部解析的一般实体名时,该处理器将被调用。该指向的目标可以是一个文件,也可以是 URL 。请参阅 外部实体名范例

(以上方法信息摘自 php 手册)

这里对一个处理器进行一下说明:

xml_set_element_handler($xml,’start_handler’,’end_handler’); // 针对开始和结束标记

设置触发方法 start_handler end_handler

Function start_handler($xml,$tag,$attributes);

Function end_handler($xml,$tag);

执行 xml_parse 方法开始解析,调用触发方法

xml_parse ( resource $xml, string $data [, bool $is_final] )

最后一定要释放 XML 解析器

xml_parser_free ( resource $xml)

SAX 解析 XML 有许多工作要做,这种方法我认为比较麻烦 , 不推荐。

 

再说说 DOM(Document Object Model) 方法,它就要简单很多。它通过遍历对象文件,在内存中建立结构树, 可以通过递归遍历所有子节点。但是消耗内存,在第一篇中我已经提过了。

由于 DOM XML 方法过多,我就不一一写下来了,可以去 PHP 手册中查找。

我只对几个重要的方法进行简单的例子描述:

$dom = new DomDocument(); // 实例化一个 DomDocument 对象

// 不论是读取 XML 还是创建一个 XML 都需要实例化 DomDocument 对象

先说读取 XML

$dom->load(‘***.xml’); // 加载一个XML 文件

$root = $dom->documentElement; // 返回文档的根节点

$children = $root->childNodes; // 返回DOMNodeList 对象信息,该对象包含所有node 子节点。

通过 foreach 遍历 $children 对象,获得所有 node 节点。根据所有 node 节点的类型,进行不同处理。

创建 XML

$html =  $dom->createElement(‘html’); // 创建一个DomDocument 对象, 通过setAttribute 设置属性

$dom->appendChild($html); // 将新创建的对象添加到Dom 节点下。

。。。。

Echo $dom->saveXML(); // XML 树结构已字符串形式输出

除了使用 DOM XML 方法操作 XML 结构外, PHP 还提供了 SimpleXML 扩展,用于读写 XML 的应用程序编程接口( API ),它也是使用 DOM 的方法。

它通过 $doc->rss->channel->item->title 的表达式方式进行操作极为简单。

除了上述的 3 种方法外, PEAR 下还有解析 DOM 的其他扩展。如: XML_TREE XML_RSS..

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值