【Java解析XML】【一】XML解析技术概括
声明:本文转自http://www.blogjava.net/orangelizq/archive/2009/07/19/287330.html,并对原文有部分改动。 ===========================
摘要:XML作为过去十年中出现的最流行的技术之一,得到了广泛的应用,而其中XML解析技术是XML应用的关键。本文介绍了XML解析技术的研究动向,分析和比较了4种XML解析技术的优劣,并归纳总结了应用系统设计中选取合适的XML解析技术的原则。 第一部分 引言XML(eXtensible Markup Language,可扩展标记语言)是由World Wide Web联盟(W3C)定义的元语言,即一种关于语言的语言。XML的设计源于SGML (Standard Generalized Markup Language,标淮通用标记语言) ,是SGML的子集,其目的是为了促进Internet上结构化文档的交换。简单的说,XML是一组规则和准则的集合,用于以无格式文本来描述结构化数据。1996年W3C联盟就开始从事XML的标准化工作,并于1998年2月10日发布了XML1.0。XML的出现给分布式计算领域带来了重大影响,其力量源于它的数据独立性。XML是纯数据描述,与编程语言、操作系统或传输协议无关,从而将数据从以代码为中心的基础结构所产生的约束中解放出来,让数据能够在Web上更自由的流通。 然而XML本身只是以纯文本对数据进行编码的一种格式,要想利用XML,或者说利用XML文件中所编码的数据,必须先将数据从纯文本中解析出来,因此,必须有一个能够识别XML文档中信息的解析器,用来解释XML文档并提取其中的数据。然而,根据数据提取的不同需求,又存在着多种解析方式,不同的解析方式有着各自的优缺点和适用环境。选择合适的XML解析技术能够有效提升应用系统的整体性能,因此,了解和区分各种不同的XML解析技术就显得尤为重要。 第二部分 XML解析技术分析所有的XML处理都从解析开始,无论是使用XSLT或Java语言,第一步都是要读入XML文件,解码结构和检索信息等等,这就是解析,即把代表XML文档的一个无结构的字符序列转换为满足XML语法的结构化组件的过程。 2.1 XML解析技术的分类根据从XML中获取数据的简易性,性能和最终所得到的数据模型的不同,XML解析技术大致可分为以下四类:1) 面向文档的流式解析;sax 2) 面向文档的对象式解析;dom 3) 面向文档的指针式解析; 4) 面向应用的对象式解析;hibernate
2.2 面向文档的流式解析技术流式解析是一种基于事件的解析过程,解析器顺序读取XML文档,产生一个对应的事件流,并向事件处理程序发送所捕获的各种事件,如元素开始和元素结束等,而事件处理程序则通过不同的方法处理这些事件。流式解析是将XML文档作为一个数据流来处理,因此,它具有类似于流媒体的优点,能够立即开始读取数据,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,不需要将整个文档一次加载到内存中,使得在处理大型文档时具有较好的时间和空间上的效率。然而效率的代价是易用性的降低,流式解析编程较为复杂,程序员需要负责更多的操作。并且由于应用程序没有以任何方式存储数据,所以使得更改数据或在数据流中往后移是不可能的。再加上它的单遍解析特性,意味着它也不支持随机访问。 流式解析又分为两种解析方式:推式解析(SAX)和拉式解析(StAX)。这两种方式的主要区别在于是由解析器还是应用程序控制读循环(读入文件的循环)。 2.2.1 推式解析(SAX解析技术) SAX(Simple API for XML)解析技术就是一种推式解析,在这种解析方式中,解析器控制着读循环,在文档结束之前控制权不会返回给应用程序。解析器通过回调的方式进行数据处理。 SAX提供了一个用于处理XML的,基于事件驱动的简单API。它的设计开始于XML-DEV邮件列表成员间的讨论,他们开发出的第一个接口草案SAX1.0于1998年1月发布,其后在2000年5月发布了SAX2.0,目前最新版本是2004年4月发布的SAX2.0.2。SAX没有经过官方的标准机构认可,它不由W3C联盟或其它任何官方机构维护(现在,SAX由David Megginson维护) ,但它被广泛使用并视为XML社区事实上的标准。SAX最初是为Java而定义的,但也可以用于Python、Perl、C++等其它语言。
SAX中的核心事件处理程序是一个实现了ContentHandler接口的类。此接口中定义了处理与XML文档本身关联的事件的方法,如 startDocument、endDocument、startElement、endElement、Characters等
2.2.2 拉式解析(StAX解析技术)
2.3 面向文档的对象式解析技术由于流式解析方式固有的无法更改数据和不支持随机访问特性,尤其是没有对XML文档的结构建模,使得应用程序很难对XML文档进行搜索、修改、添加和删除等操作。为了解决这些问题,产生了面向文档的对象式解析技术--DOM。DOM(Document Object Model)是用与平台和语言无关的方式对XML文档进行建模的官方W3C标准,其目标是提供一个可以通用于各种程序语言、操作系统和应用程序的接口。DOM最初被当作Web浏览器识别和处理页面元素的方式,即在W3C介入之前的功能,称为“DOM Level 0”。W3C于1998年10月提出了“DOM Level 1”建议,支持XML1.0和HTML处理。随后于2000年11月提出了“DOM Level 2”建议,对Level 1进行了扩展,支持XML1.0、命名空间和CSS,也支持用户接口和树形操作事件,并且添加了DOM树形操作功能。最新的“DOM Level 3”建议于2003年6月提出,在level 2的基础上添加了对DTD、XML模式和XPath的支持。 DOM作为一种对象式解析技术,定义了层次化对象模型来表示XML文档。即为XML语法中的每个概念(如元素,属性,实体,文档等)定义对应的类,而解析器在读入XML文档的时候,会建立XML语法和类之间的一一映射。实际上,DOM的层次化对象模型是一个树形结构,它将一个XML文档看作一棵节点树,每个节点代表一个XML文档中的元素。DOM的基本节点对象有5个:(1)Document对象:是树的最高节点,也是对整个文档操作的入口;(2)Element和Attr对象:对文档中元素和元素属性的映射;(3)Text对象:作为Element和Attr对象的子节点,代表了元素或属性的文本内容;(4)NodeList对象:对节点按指定的方式进行遍历。 例如对于2.2.1中的XML文档,其对应的DOM节点树如下图所示(注意元素内的空格或回车也会被当作文本对象):
利用DOM在内存中建立的完整的XML文档的树形结构,开发人员就可以方便的对XML文档进行一系列操作,如遍历、增加、删除、修改文档内容等,且具有良好的导航能力。同时DOM所具有的对象特性也非常便于面向对象编程。然而,由于DOM在使用数据前需要完整的遍历XML文档,在内存中构建树形结构表示,因此需要消耗大量的内存,尤其是对于大型文档,性能下降的很快。而且必须一次解析整个XML文档,不可能只做部分解析,当只关注XML文档的小部分数据时,效率很低。(Axis2项目中的Axiom对象模型实现了对XML文档的部分解析,可构建不完整的节点树,但实现较为复杂)
2.4 面向文档的指针式解析技术前面提到的面向文档的流式解析效率较高,但易用性差,而对象式解析易用性强,却效率较低,这两种方式似乎处于两个极端。其效率问题主要在于两种方式都是提取解析模式,即解析时,提取一部分源文件,一般来说是一个字符串,然后在内存中进行解析构建。这种解析模式注定了需要大量的创建和销毁对象,而且还存在更新效率问题,在DOM中(SAX并不支持更新),每一次改动都需要将DOM模型重新完整的解析成XML字符串,原文件并没有被利用,即DOM并不支持增量更新。为了解决这些问题,提出了一种较新颖的指针式解析技术,即VTD-XML。
令牌开始偏移量(即相对于XML文档头部的距离)是30 bits,也就是说它能解析的最大文件是1G。令牌长度为20bits,即一个令牌的最大长度是1M。令牌类型4bits,说明支持16种词汇类型。
2.5 面向应用的对象式解析技术前面所谈到的三种解析技术都是从XML的角度来处理文档和建立模型,这对于主要关心文档的XML结构的应用程序来说是适用的,但是有很多应用程序仅仅将XML作为数据交换的媒介,它们更关心的是文档数据本身。此时,面向应用的对象式解析(或称为XML数据绑定)可以使应用程序在很大程度上忽略XML文档的实际结构,而直接使用文档的数据内容。数据绑定是指将数据从一些存储媒介(如XML文档、文本文件和数据库)中取出,并通过应用程序表示这些数据的过程,即把数据绑定到虚拟机能够理解并且可以操作的某种内存中的结构。数据绑定并不是一个新鲜的概念,其在关系数据库上早已得到了广泛的应用,如Hibernate就是针对数据库的轻量级数据绑定框架。而针对XML数据绑定的Castor框架在2000年就已经出现,目前已经涌现出了许多类似的框架,如JBind、JAXB、JiBX、Quick和Zeus等。 其中JAXB(Java Architecture for XML Binding)是一个处于不断发展中的应用于Java平台的数据绑定框架,提供了一套在XML文档和Java对象之间自动映射的API,符合JSR31--XML数据绑定规范(XML Data Binding Specification)。该项目始于1999年8月,由Java Community Process开发,其1.0版本于2002年10月发布。 如下图,显示了数据绑定在数据库和XML文档中的应用。
在数据绑定中有三个重要概念:
如果应用程序使用文档模型方法,那么获得所需要的数据就必须在节点树中根据父子节点关系进行遍历。而使用数据绑定方法,只需进行正常的Java编程,访问数据更加容易,速度也比文档模型快得多。而且,XML数据绑定并不只是简化编程,由于它把许多文档细节抽象出来,所以数据绑定所需的内存通常少于文档模型所需的内存,如上图中,文档模型方法使用了10个单独的对象,而数据绑定才使用2个。此外,由于要构建的对象少得多,所以为XML文档构建数据绑定表示还可能更快。
第三部分 各种解析技术的比较
面向文档的流式解析效率较高,但易用性差,而对象式解析易用性强,却效率较低。
VTD很好的解决了前两种解析方式的缺点,通过其巧妙的设计使得在解析XML文档时内存占用少,效率高,并且还能够实现XML文档的快速解析与遍历、提供对XPath的支持。VTD的出现是XML解析技术的一大进步,会对XML解析技术的发展产生巨大影响。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |