支持多浏览器读取X M L内容的方法实现

2010-04-16 09:15陈春艳
电脑与电信 2010年6期
关键词:浏览器代码客户端

陈春艳

(广州市市政职业学校经济与管理部,广东广州510500)

1.引言

XML(可扩展标记语言)因为其轻便简洁、结构严谨、跨平台支持等多种特性,现已经广泛地应用于各种应用程序的数据存储、数据交换当中。B/S结构的应用程序都普遍使用XML语言传输数据。特别在对Web Service进行调用时,其返回结果必然为XML格式的内容。

可是XML的设计目的是用来传送及携带数据信息,不是用来表现或展示数据,因此单纯的XML并没有规定如何显示数据。虽然可以在定义XML文件的时候,使用CSS、XSLT等方式规定XML内容的布局与呈现;但在B/S结构的Web应用中,特别是Web Service的调用返回时,由于考虑到网络传送的问题,往往都只是纯粹的XML文本;这就只能依靠客户端脚本呈现文本内容。

在AJAX应用模型中,通常利用XMLHttpRequest对象发送服务器请求,若服务器端返回的数据是XML格式,则通过XMLHttpRequest对象的ResponseXML属性获得返回数据。在主流的浏览器中,所获得的ResponseXML内容存在一定的差异,而且不同浏览器所定义的XML DOM也各有千秋。这样使得客户端编程的程序员难以只用一种方法直接将XML的数据呈现在不同的浏览器中,这大大增加了Web应用开发的难度和开发时间。

2.IE与Firefox对ResponseXML处理的差异

微软的IE在个人电脑用户浏览器的使用份额中占有比较大的优势,达到60.65%,其次是使用Mozilla内核的FireFox浏览器,达到24.52%(注:来自Net Applications公司2010年3月的调查数据)。两大主流浏览器之间,对于服务器端返回ResponseXML对象从内容到操作对象都有很显著的区别。

IE浏览器所得到的ResponseXML对象与实际的XML内容比较一致,而且可以通过名为xml的属性得到包括XML声明在内的全部内容。可通过代码如alert(XHR.ResponseXML.xml)访问全部的XML内容。

假设现有ResponseXML对象得到的内容部分节点如下所示:

在访问XML的数据内容时,通常有两种方法。第一种方法是遍历法。因为XML文档的内容结构是一棵有着众多节点的树,因此可以通过逐层遍历的方式,从父元素节点一直访问到最终的叶子元素节点,通过叶子元素节点的test属性得到其文本节点的内容。可通过以下代码得到第一个class的title元素的文本内容。

如果利用节点访问的方式,可以通过nextSibling属性返回当前节点的下一个兄弟节点。由于IE浏览在构造XML内容节点的时候,某父节点下的所有子节点是利用一个数组存储的。因此可以利用节点的索引得到需要的子节点内容。可通过以下代码可跳过第一个class节点得到第二个class的内容。

第二种方法是按照元素名称直接访问法。通过getElementById的方法,可以得到全部元素名相同的节点。该方法所返回的是一个节点数组,通过循环遍历数组中的元素则可以得到全部信息内容。可通过以下代码得到两个title元素的内容。

在Firefox浏览器中,服务器应答的responseXML内容与实际的XML内容有较大的差异。在Firefox中,不会去除元素之间的空格符号,因此每一个元素节点的第一个子节点不是元素类型,而是文本类型。这样就导致内容信息在Firefox中节点的索引编号与IE并不一样。如图1所示,Firefox中每个class节点前都有一个空的文本节点,子节点总数为4而不是2。

图1 Firefox中的节点信息

此外,在Firefox中并不存在一些IE特有的方便访问XML内容的方法。如上文提及的xml和text属性。因此,上面在IE中可以成功访问XML内容的代码全部失效,程序员不得不为Firefox的用户重新写一遍读取的方法。以下代码演示读取第二个class元素的title内容在Firefox中的修正。

3.W3C的DOM对象

W3C组织是对网络标准制定的一个非赢利组织,W3C定义了包括XML和DOM在内的许多互联网应用的协议规范。其中DOM(文档对象模型)为HTML、XML等数据载体和信息载体在内存中的处理提供了一种基本的对象模型。标准中提供连接到文件的结构、格式、事件等各方面的内容。由于不依赖于任何程序设计语言和网页描述语言,它为有效处理HTML和XML数据提供了一种标准的、独立的接口。

不同的浏览器厂商在设计浏览器所支持的DOM时会做出一些修改。这样就导致了不同的浏览器之间对XML操作会存在不同的属性和方法。

在W3C协议中,规范定义了XML DOM的一些操作内容。其中比较常用且大多数浏览器都支持的属性有:attributes——返回元素的属性集合;childNodes——返回元素的子节点的节点数组;firstChild——返回元素的首个子节点;nextSibling——返回元素之后紧跟的节点;parentN-ode——返回元素的父节点;previousSibling——返回元素之前紧随的节点;nodeValue——返回当前节点的内容值(非文本节点无效)。

比较常用且大多数浏览器都支持的访问XML的方法有:getElementsByTagName()——找到具有指定标签名的子孙元素;getAttribute()——返回属性的值;getAttributeNode()——以Attribute对象返回属性节点。

4.重新定义方法封装W3C操作

如果每一次读取XML的信息都要先判断浏览器的类型,然后再使用不同的方法得到相应的信息,对于程序员来说是一件痛苦的事情。若利用各个浏览器都支持的XML DOM属性和方法,将访问元素节点的方法重新封装,通过这种方法可以减轻程序员的负担。

先判断当前的浏览器是IE内核还是Mozilla内核,并用一个全局变量记录当前浏览器类型。关键代码如下所示:

定义一个函数getNodeValue(node,tagname),参数node是元素节点,tagname是标记的名称。该函数将根据不同的浏览器类型,在node的子节点中找出标记名称为tagname的元素节点的值,并将其返回。关键代码如下:

当我们需要访问第二个class节点的title内容时,就可以简单用一个方法实现。

以上代码均在IE7+和Firefox3.5+测试通过。这样,客户端程序员就可以忽略浏览器的复杂性,专注于数据的显示和布局等其它方面的设计。

5.总结

在RIA应用越来越频繁的今天,客户端编程的作用越来越大,而Javascript作为客户端使用率最高的脚本也越来越强大,但脚本又要依赖于浏览器的支持;基于种种的理由,不同浏览器之间对脚本的支持不可能完全统一。一方面为了支持更多的客户端平台,另一方面减少客户端编程人员的重复工作,这就需要将不同浏览器之间共同支持的方法进行提取,重新整合封装,以便在客户端编程的时候可以更快捷调用。

[1]吴洁.XML应用教程(第二版)[M].北京:清华大学出版社,2007.

[2]高怡新.XML基础教程[M].北京:人民邮电出版社,2009.

[3]基思(英).JavaScript DOM编程艺术[M].北京:人民邮电出版社,2007.

[4]左伟明.完全掌握XML——基础概念、核心技术与典型案例[M].北京:人民邮电出版社,2009.

猜你喜欢
浏览器代码客户端
如何看待传统媒体新闻客户端的“断舍离”?
反浏览器指纹追踪
创世代码
创世代码
创世代码
创世代码
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
环球浏览器
客户端空间数据缓存策略