admin 管理员组

文章数量: 1086019


2024年4月29日发(作者:assign和allocate)

维普资讯

第38卷(2oo7)第6期 计算机与数字工程 137 

脚本语言PHP的XML应用支持 

李昕 

长沙410205) (湖南财经高等专科学校信息管理系

摘要探讨脚本语言PHP中对XML的应用支持,分析两种XML解析的PHP实现方式,即应用基于SAX的XML解 

PHP XML Expm SAX DOM 

TP312 

析器Expat,应用Expand DOM类完成XML解析,表现PHP对XML应用支持的灵活性。 

关键词

中图分类号

1 引言 

XML(可扩展的标注语言)是一种W3C标准, 

主要用于Web应用程序和服务器之间实现容易的 

来处理。 

在较低版本的PHP中就包含了一个基于SAX 

的XML解析接口,开始了对XML的支持;此后 

PHP4逐步增加了更好的XML支持,首先添加了 

DOMXML扩展模块和XSLT,后期在DOMXML扩 

展中也添加了其它一些功能,如HTML和DTD验 

证。PHP 4所提供的是不稳定的而且是非w3c兼 

交互、数据的存储与使用。它是一整套定义语义标 

记的规则,这些标记将文档分成许多部件,并对这 

些部件加以标识。它是当今最热门的技术之一,已 

在INTERNET世界被广泛接受和使用,成为数据 

交换的重要标准。 

PHP(Hypertext Preprocessor超文本预处理器) 

容的DOM XML扩展,这些扩展也存在不少需要修 

复的问题,始终处于不断修改中,因此未得到广泛 

的使用。正因为如此,在PHP5中,XML支持部分 

几乎被全部重新编写。PHP5的所有XML扩展都 

是基于GNOME项目的LIBXML2库,允许不同的 

扩展模块之间互相操作,开发者可以在同一个底层 

的库上进行开发。除了继承SAX解析器,PHP5还 

支持遵循W3C标准的DOM和基于LIBXSLT引擎 

的XSLT,同时还加入了PHP独有的SimpleXML, 

符合标准的SOAP扩展,有利于Web服务的应用。 

是一种HTML内嵌式的语言,其独特的语法混合 

了C、Java、Perl以及PHP式的新语法,可以比CGI 

或者Perl更快速地执行动态网页,已经成为一种 

得到广泛应用的服务器端脚本语言。它不仅在相 

当早的版本就开始支持XML,而且不断加强完善 

了这种支持。 

2 PHP对XML的支持 

正确提取及有效识别XML文档中的数据,是 

进行XML文档数据后期处理的前提。这就需要对 

3 Expat功能分析 

Expat是PHP脚本语言内置的XML解析器, 

文档进行解析。应用程序必须通过XML解析器访 

问XML文档的结构和内容。一种语言对XMI.的 

支持往往起始于其内置XML解析机制的引入。 

XML解析器有两种基本类型:(1)基于DOM 

的解析器:将整个XML文档转换成内存中的DOM 

树型结构,同时提供一个API来添加、编辑、移动或 

删除树中的任意一个元素;(2)基于SAX的解析 

它也被运用在其它开源项目中。它正是一种基于 

SAX的解析器。这种解析器有一个针对XML文档 

的数据集中视图,它关注的是XML文档的数据部 

分,而不是其结构。这种解析器按照头到尾的顺序 

处理文档,并将类似于元素头、元素尾、特征数据的 

开始等一系列事件,通过回调函数报告给应用程 

序。与基于DOM的解析器不同,基于SAX的解析 

器并不需要描述被解析的XML文档的完整树型结 

构。它提供了更底层的访问,可以更好地利用资源 

器:将XML文档视为一系列的事件。当一个指定 

事件发生时,解析器将调用开发者提供的相应函数 

收到本文时间:2006年10月12日 

基金项目:湖南省教育科学十一五规划课题(编号2006XJ150)资助 

作者简介:李昕,女,副教授,研究方向:计算机网络、电子商务和数据库技术。 

维普资讯

138 李昕:脚本语言PHP的XML应用支持 第38卷 

和更快地访问。这种方式的明显优势就是无须将 

整个XML文档都放入内存。l】 

4 使用D0MXML 

在PHP4可以使用DOMXML来操作XML数 

据,但当时版本的DOMXML不符合W3C标准命 

名,而且还出现过内存泄漏问题。PHP5中新的 

DOM扩展是基于W3C标准完成的,包含方法和属 

性名称。由于改用了新的标准,基于原来的 

为了追求处理速度,Expat解析器并不检查 

XML的有效性,它可以忽略XML文档相关的模式 

文件如DTD,但仍然要求被解析XML文档格式必 

须完整,否则与其他符合XML标准的解析器一样, 

Expat也将会停止,并提交出错信息。正是由于不 

检查有效性,快速和轻巧的Expat成为了非常适合 

互联网运行的解析器。 

Expat解析XML的基本过程包括五个步骤 : 

(1)创建一个XML解析器实例; 

(2)定义处理触发事件的函数; 

(3)定义实际意义的数扼处理程序; 

(4)打开XML文件,读取文件数据并解析 

数据; 

(5)关闭文件,释放XML解析器。 

基于SAX的解析器在解析文档前通常要求注 

册回调函数,以保证特定的事件发生时的正确调 

用。Expat不处理例外事件,表1列举了它定义的 

七个可能事件 : 

表1 Expat的主要XML解析函数 

各种回调函数都必须将解析器的实例作为其 

第一个参数。例如开始元素的处理函数,就需要传 

递三个参数,其脚本范例定义如下: 

function start

element( parser,¥name,¥attrs) 

这里第一个参数就是解析器实例标识,第二个 

参数是开始元素的名称,第三参数为包含元素所有 

属性和值的数组。用于产生XML解析器实例的函 

数是xml—parser—crea ()。该实例将被用于以后 

的所有函数。开始解 XML文档后,Expat在遇到 

任何一个开始元素时,都将调刖已被定义好的start 

element()函数,并将参数传近过去。 

DOMXML的代码将不能直接运行,需要将加载函 

数和保存函数进行修改,删除函数名中的下划线, 

以及对其它各处进行必要的调节,但主体逻辑部分 

可以保持不变 J。 

4.1加载XML对象及访问节点 

使用DOM来操纵XML对象,首先要创建一个 

DomDocument对象,然后载入XML文件。XML对 

象被加载到内存中成为DOM树后,PHP5提供了 

很多方法来直接取得指定名称的元素,最便捷的就 

是使用getElementsByTagName(¥tagname)。下列 

代码即可遍历所有TagName为“title”的元素。 

¥dom=new DomDocument(); 

¥dom一>load(“articles.xml”); 

¥titles=¥dom一>getElementsByTagName(“title”); 

foreach(¥titles as¥node){ 

print¥node一>textContent.“4\n”: 

} 

其中textContent属性虽不是W3C标准,但它 

可以快速方便地读取一个元素的所有文本节点。 

而遵循W3C的标准进行文本节点读取时,代码则 

应改为: 

¥node一>firstChild一>data: 

4.2遍历所有指定节点 

getElementsByTagName()返回一个Dom— 

NodeList对象,而在PHP4中get—elements—by—tag- 

n ̄tme()则返回一个数组,但该DomNodeList对象 

仍可以使用foreach语句进行遍历,也可以直接使 

用¥titles一>item(0)来访问结点。 

在t)OM树中 另一个更复杂、更灵活的取得 

所有指定元素的办法是从根结点遍历。 

foreach f¥dom一>documentElement一>childNodes as 

¥articles){ 

if f¥articles一>nodeType==1&&¥articles一>no— 

deName==“item”){ 

foreach(¥articles一>childNodes as¥item){ 

if f¥item一>nodeType==1&&¥item一>nodeName 

==

“title”){ 

print¥item一>textContent.“\n”;//对所有item一> 

title元素进行操作}}} 

维普资讯

第38卷(2007)第6期 

} 

计算机与数字工程 

¥titlespace一>appendChild(¥titletext): 

¥item一>appendChild(¥titlespaee): 

139 

4.3 xML元素的增删改操作 

利用内存中已建成的DOM树处理XML对象, 

除了能迅速读取和查询,同样也可以迅速进行增删 

和改写操作。下面代码就是在channels.xml文件 

中添加了一个新元素。 

¥item=¥dom一>createElement(“item”); 

¥title=¥dom~>createElement(“title”): 

¥titleText=¥dom一>createTextNode f“new title 

¥this一>documentElement一>appendChild(¥item): 

¥dom:new Articles(): 

¥dom一>load(“articles.xml”): 

¥dom一>addArtiele(“XML in PHP5”); 

5 总结 

采用Expat或扩展DOM类解析XML文档,将 

分别获得来自SAX和DOM的优势。前者适于快 

速、顺序、大量地处理XML数据对象,主要是速度 

和内存耗用上的优势;后者适于对XML数据对象 

text”); 

¥title一>appendChild(¥titleText): 

¥item~>appendChild(¥title); 

¥dom~>documentElement一>getElementsByTagName 

(“channel”)一>item(0)一>appendChild(¥item); 

这里首先创建了一个item元素,一个title元 

素和一个包含item标题的titleText文本结点,形成 

三级层次;然后将所有的结点按层次结构链接起 

来,把文本结点titleText加到title元素上,把title 

元素加到item元素上,最后把item元素插人到 

channel根元素上,在DOM树上添加一个节点的操 

作就完成了。 

而从DOM树中删除一个节点则更简单了: 

¥dom~>documentElement一>RemoveChild(¥dom一 

方便地进行各种复杂的加工操作,主要体现了操作 

便捷的优势。 

本文通过对PHP内置的两种xML文档解析 

机制的剖析,反映了PHP对XML应用的全面而深 

人的支持。以Web为中心的PHP对XML的支持 

逐渐遵循了W3C标准,功能13益强大,互用协作性 

增强。PHP5引入的SimpleXML扩展更提供了非 

常简捷的XML文档访问方法,可以节省很多的代 

码。XML在PHP中的应用支持已经非常全面,并 

不断得到提升,其进一步发展值得期待。 

参考文献 

>documentElement一>getElementsByTagName(“channel”1 

>item(0)): 

4.4扩展DOM类 

在PHP5中使用扩展DOM类的新特性,可以 

书写可读性更强的代码。下面是用DOMDocument 

类重新编写的添加节点的代码例子: 

class Articles extends DomDocument{ 

function addArticle(¥title){ 

¥item=¥this一>createElement(“item”); 

¥titlespace=¥this一>createElement(“title”); 

¥titletext=¥this一>createTextNode(¥title); 

[1]聂丹,XML在脚本语言PHP中的应用[J],丹东纺专学 

报,2005(1):42—44 

[2]刘小东,XML技术上传文件[J],中国ASP,2003(2): 

27~34 

[3]PHP的XML分析函数,http://www.ahaoz.corn/Article/ 

1/138/427,'2005/2005l1 1244856.html 

[4]PHP5的XML新特性,http://www、wengu.conr/main/ 

Artiele/website/language/php/200603/

2n06 

10659.shtml, 

≯ s ) 

s ) 

(上接第119页) 

super—peer组内super—peer间的负载平衡关系考 

World Wide Web conference on Alternate track papel’s& 

posters.May 2004 

虑不多,这些都是以后继续研究的内容。 

参考文献 

[3]The JXTA website[EB].http://www.jxta.com 

[4]孙帅,董小社等.基于三层P2P结构的网格资源发现模 

型[J].微电子学与计算机.2005.8:】27—129 

[5]Lei Guo etc.Exploiting Content Localities for Eficifent 

Search in P2P Systems[J].Springer—Verlag GmbH. 

Volume 3274/20o4 

[1]周文莉,吴晓非.V2P技术综述[J].计算柳工程与设 

计.2006.1:77—78 

[2]Hsinping Wang.etc.Posters:Dynamic search in peer—to 

[6]唐辉,张国杰等.一种混合P2P网络模型研究与设计 

J].计算机应用.2005.3:522—524 peer networks[C].Proceedings of the 13th international 


本文标签: 文档 解析器 元素 解析 函数