首页 理论教育PHPMVC开发实战-XML引擎使用与查询操作

PHPMVC开发实战-XML引擎使用与查询操作

【摘要】:上述XML代码共有两条新闻数据,通过浏览器直接访问将能够正确识别。由于DOM首先将XML载入内存,这就意味着在引擎还没最终输出结果前,开发人员可以对内存中的数据进行增、删、改,这也是DOM最为强大的功能。DOM查询XML前面使用ASX引擎能够方便地对XML数据进行查询,接下来将使用DOM进行同样的查询操作,帮助读者加深对DOM与SAX的认识。

XML是一种标记性语言,由GML(一种工业平面印刷描绘语言)派生而来。由于它的扩展性好、可编程性高、数据传输量大等特点,所以很早就被用于Web数据交互。早在2004年,微软发布IE6浏览器时就能够支持简单的XML通信,由于XML国际化标准的设定,近年来各类编程语言几乎都对XML提供了全方位的支持,有些编程技术甚至单独内置XML解释引擎(例如Object-C编程),足见XML的活力及优势。

早期的PHP版本(4.x)对XML的支持是不完善的,但现在的PHP已对XML提供了完善的支持(无论是解释还是生成)。PHP 5.x对XML的处理主要有4种方式:SAX(Simple Api for XML)引擎、Dom(Document Object Model)解释器、SimpleXML扩展、XML Reader扩展。ThinkPHP内置的XML处理技术也是基于上述方式的。下面首先对PHP原生的XML处理机制进行简单讲解,然后结合ThinkPHP框架讲解在MVC中处理XML文档。

1.SAX

SAX引擎是一款轻量级的XML处理引擎,它的执行过程是由上而下顺序执行的。SAX在处理XML时使用的是异步事件驱动机制,这能够在快速反应的同时及时地捕捉到XML中的节点信息,由于SAX是单向无缓冲的,所以SAX非常适用于手机终端等内存受限设备上(IOS、Android等默认使用SAX来解释XML)。

PHP作为一门网站编程语言,在讲求运行效率的网站应用需求上,同样也默认使用内置的SAX解释引擎处理XML。开发人员在安装完PHP 5.X之后就能够使用SAX开发XML网站了。下面将通过一个简单的示例讲解SAX解释XML的全过程。

假设网络上有一个XML接口,现在需要使用PHP来解释该文档中的数据,以便进行开发。XML文档数据如以下代码所示。

上述XML代码共有两条新闻数据,通过浏览器直接访问将能够正确识别。接下来将使用xml_parser_create函数创建XML对象,并使用xml_parse来提取文档中的节点信息。这两个函数是SAX引擎的核心函数,使用时与普通的PHP函数并无区别。为了方便代码管理,这里将SAX创建XML数据对象及解释XML数据全过程封装成一个功能类,并命名为SaxXmlClass,代码如下所示。

最后只需要在使用页面中实例化SaxXmlClass类,并调用data属性即可,该属性存放着最终生成的数据对象,代码如下所示。

将代码保存,直接访问页面将会看到运行结果。这些新闻数据不是来自于数据库,也不是来自于纯文本,而是来自于具备跨站通信能力的XML。

2.DOM

DOM全称为Document Object Model(文档对象模型),从名称上就可以看出DOM是专门用于处理文档数据的。事实也如此,DOM能够处理多种文档,包括常见的SGML、HMTL、XHTML、XML、RSS等。PHP内置的DOM用于处理HTML、XML等是非常合适的,也是非常高效的。

与SAX不同,DOM处理XML时首先将XML加载到服务器内存,然后再进行解释,这种解释方式是不需要按照顺序执行的,最开始载入的节点最终的解释顺序未必就排在最前面。由于DOM首先将XML载入内存,这就意味着在引擎还没最终输出结果前,开发人员可以对内存中的数据进行增、删、改,这也是DOM最为强大的功能。同时,由于DOM是先载入后解释的(SAX是同时载入同时解释),使得数据能够被缓存,所以在解释大型的XML数据时DOM性能更加出色,接下来将继续以前面的例子为基础,详细介绍DOM的使用。

(1)DOM查询XML

前面使用ASX引擎能够方便地对XML数据进行查询,接下来将使用DOM进行同样的查询操作,帮助读者加深对DOM与SAX的认识。PHP 5.x对DOM的支持已经非常完善,开发人员不需要再手动安装插件,只需要实例化DOMDocument基础类即可。该类提供了所有对文档进行操作所需要的方法和属性,其中用于查询XML文档的方法主要为documentElement、getelementsByTagName、childNodes。

其中documentElement用于得到XML文档的根节点;getelementsByTagName返回带有指定标签名的对象集合;childNodes返回所有子节点(最内层的节点)。熟悉JavaScript的读者,相信对DOM并不会感到陌生。事实上,PHP内置的DOM引擎和JavaScript中的DOM引擎使用方式上都是相似的。下面将结合代码演示DOM查询news.xml文档的全过程。

首先创建一个功能类,并命名为DomNewsXML。该类于用创建解释器对象,并且完成数据的查询,如以下代码所示。

将上述代码保存,在使用文件中只需要调用show_message方法即可得到news.xml文件中的数据,调用文件代码如下所示。

该示例的运行结果和前面使用SAX的结果是一致的。读者可以在此基础上继续完善,实现更复杂的XML文档查询。(www.chuimin.cn)

(2)DOM增加XML元素

DOM最强大的功能之一就是可以对文档模型进行CURD操作。其中对XML增加文档元素,只需要调用DOMDocument基类类中的appendChild方法即可。这里继续以DomNewsXML.class.php文件为例,在该类中添加add_news方法,该方法用于实现添加新闻,代码如下所示。

如上述代码所示,为news.xml文档添加row子节点,就相当于添加新闻数据。整个流程共分4步骤:首先使用documentElement方法根据构造函数中载入的XML文件创建文档对象;然后定义数据节点,并使用appendChild方法添加到文档对象中;接着将所有节点添加到row父节点下;前面的步骤都是在内存中完成的,最后还需要使用save方法写入到news.xml文件中(即保存到硬盘中)。

需要注意的是,创建文档对象节点的过程中,PHP中的DOM引擎对中文汉字的支持存在BUG,开发人员需要手动将汉字显式地转换为UTF8编码(就算当前文件为UTF8编码也需要转换)。

最后在使用文件中直接调用add_news方法并传入新闻数据参数即可,如以下代码所示。

(3)DOM删除XML元素

使用DOM删除XML元素非常简单,只需要调用DOMDocument基类中的removeChild方法即可。下面继续以DomNewsXML.class.php文件为例,在该类中添加delete_news方法,实现新闻数据的删除,代码如下所示。

通过前面的例子,可以看到DOM在处理文档模型数据时非常完善和强大。与其他XML引擎不同,DOM对文档节点的CURD操作是彻底及完善的。因为DOM的强大及出色,所以很早就被W3C推荐为处理可扩展置标语言的标准编程接口。但有一点读者需要明白的是,虽然PHP可以使用DOM来处理文档模型,但通常来讲在PHP中只需要读取即可(数据通常保存到数据库),文档模型的CURD操作一般处理界面UI时才需要使用,例如Jquery、ExtJs等框架都提供了完善的DOM支持。

正因如此,PHP还内置了一种更加简单和易用的XML查询解释扩展SimpleXML。该扩展处理机制上与SAX相似,并且拥有SAX快速及稳定的特性,但相对SAX来说,SimpleXML在使用方式上更加简单及高效,所以SimpleXML是PHP官方推荐使用的XML解释引擎。

3.SimpleXML

SimpleXML是PHP内置的一款标准XML解释器,使用SimpleXML来解释XML是高效和稳定的。如果只需要单纯的查询XML文档,那么使用SimpleXML是一个非常好的方案。SimpleXML不需要像SAX引擎那样使用多个方法进行捕捉XML信息,也不需要像DOM那样多次调用相应的方法遍历文档模型。SimpleXML将XML文件映射为一个PHP类对象,调用类中的成员就等于获取XML文档中的节点信息。下面将结合示例代码详细介绍SimpleXML的使用。

继续以前面创建的news.xml文件为例,使用SimpleXML来解释并提取文件中的数据。首先创建一个类,并命名为SimpleXMLNews.class.php。该类用于实现所有SimpleXML查询操作,如以下代码所示。

如上述代码所示,使用SimpleXML处理XML文档将变得非常简单。整个步骤只需将XML文档数据传入到simplexml_load_string函数,该函数接受字符串数据。类似的函数还有simplexml_load_file、simplexml_import_dom、similar_text等,这些函数都是用于载入数据的,只是载入的方式有所不同。

但不管哪种方式载入数据,只要成功载入数据,SimpleXML引擎就会自动将XML文档中的节点映射为类成员属性,开发人员可以像普通的面向对象开发一样直接实例化对象(例如$xmlObj->title相当于获取title节点文本),实现查询XML。但为了方便前台调用,所以在上述代码中将$xmlObj对象转换为数组。使用时直接调用readXml方法即可,如以下代码所示。

通过前面的介绍,相信读者已经能够领会到3种主流XML引擎的要点。SAX解释速度快,适用于数据量少的XML文档(300KB以下),基于事件驱动的函数式触发能够准确捕捉到XML文档中的每个元素、节点、属性等;DOM引擎是一款W3C推荐的文档模型处理引擎,得益于在内存中处理数据,所以能够提供强大的CURD文档模型操作功能,同时很好地避免了因即时解释造成的超时,所以DOM能够应用于大型数据文档(前提是服务器内存足够大);SimpleXML是一款小巧的PHP扩展,只需要传入数据,所有XML的处理过程将由SimpleXML自动完成,开发人员只需要实例化对象即可。

综上所述,如果需要快速开发,可以使用SimpleXML;如果对性能要求比较苛刻,可以考虑SAX;如果文档数据比较大(1024KB以上),则需要使用DOM。在实际应用开发中,读者可以根据需要进行选择。

另外,XML Reader解释引擎也是一款高性能的XML处理引擎,该引擎以数据流的方式对XML进行操作,能够对整个文档节点进行顺序全部读取(SAX只能处理部分节点),并且对大数据进行了分段处理(将一部分数据存放在缓存区中,一部分在内存中进行解释),所以XML Reader是非常优秀的XML引擎。由于篇幅所限,这里将不再深入介绍,感兴趣的读者可以参考PHP官方手册。