5.统计查询如果严格来区分,统计查询并不算查询语言的讲述范畴,因为在ThinkPHP中要进行字段数值统计并不需要额外定义数组元素,只需要更改显示方式即可。......
2023-11-04
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官方手册。
有关PHP MVC开发实战的文章
5.统计查询如果严格来区分,统计查询并不算查询语言的讲述范畴,因为在ThinkPHP中要进行字段数值统计并不需要额外定义数组元素,只需要更改显示方式即可。......
2023-11-04
ajaxReturn方法返回结果受DEFAULT_AJAX_RETURN配置项影响,默认值为json,可选的值有json、eval及xml。表9-1 ajaxReturn方法参数Model类中的select或find方法返回的数组原本就是关联数组数据,所以ajaxReturn能够很好地将结果转换为XML文档,如以下代码所示。......
2023-11-04
Smarty并不是一项新的PHP技术,而在PHP 4.x以前就已经是非常流行的界面与后台相分离的技术。直至现在,Smarty依然盛行,这点从各大招聘网站中可见一斑。所以要深入理解这两者之间的关系,还需要读者真正掌握Smarty的使用。图13-1 Smarty前台后分离图13-2 Smarty执行流程相信读者对Smarty的执行流程并不陌生,因为前面介绍的ThinkPHP模板引擎就是以相同的方式处理模板的。所以本章重点介绍Smarty引擎,读者在深入掌握该模板引擎的使用后,将会对MVC设计有更深入的认识。......
2023-11-04
首先需要使用content方法连接上Memcached服务器,代码如下所示。接下来将继续使用Memcache成员方法对缓存数据库进行操作。stats cachedump:显示slabs指定范围内的缓存项,例如stats cachedump 0,3。......
2023-11-04
接下来将使用CodeIgniter实现一个简单的新闻列表,用户点击列表中的新闻标题将会进入新闻的正文页面,通过该例子演示CodeIgniter实现MVC开发的流程。在CodeIgniter中,控制器命名规则比较灵活,它不需要加前缀或后缀,一个普通的文件即可。......
2023-11-04
Json能够应用在许多场合,包括PHP本身就提供了对Json的反序列化操作。事实上,Json在传送大量数据时本身是存在溢出的,所以在设计时服务端要尽量避免输出大量Json数据。要达到前后台分离设计,使用Json通信最好不过了,因为主流的UI设计框架都对Json提供了完善的支持,下面将以Jquery为基础,详细介绍Ajax与Json的开发过程。由于使用Jsonp进行异步获取数据,所以Ajax异步通信变得简单。......
2023-11-04
ThinkPHP的模板引擎高效之处在于灵活的视图标签,熟悉这些标签的使用方式将能够提高视图模板的设计水平。接下来将从基本的创建视图开始,然后深入介绍默认视图引擎的使用。创建一个视图可分为以下几个步骤。需要注意的是,使用默认的{$}边界符,在视图模板中使用JavaScript等脚本时,有可能造成冲突。ThinkPHP内置了多种视图引擎,在默认情况下系统会使用内置的视图引擎,如果使用第三方的视图引擎,变量的分配方式会有所不同。......
2023-11-04
在数据库开发中,查询和插入数据是同等重要的,ThinkPHP对数据的插入、更新等都做了高度封装,系统提供create方法,用于创建数据对象。图7-2 create创建数据流程2.create数据操作前面介绍了create方法的运行过程,读者只需要理解即可,在实际应用开发中创建数据的过程是极其简单的。下面将结合示例代码,介绍create方法的实际应用,加深对create方法的认识。一切完成后,此时数据对象存放于内存中,使用add方法进行提交,完成整个create创建数据的过程。......
2023-11-04
相关推荐