XML解析技术

上一篇 / 下一篇  2013-07-03 17:43:33 / 个人分类:Web

1 引言

XML(eXtensible Markup Language,可扩展标记语言)是由World Wide Web联盟(W3C)定义的元语言,即一种关于语言的语言。XML的设计源于SGML (Standard Generalized Markup Language,标淮通用标记语言),是SGML的子集,其目的是为了促进Internet上结构化文档的交换。简单的说,XML是一组规则和准则的集合,用于以无格式文本来描述结构化数据[1]1996W3C联盟就开始从事XML的标准化工作,并于1998210发布了XML1.0

XML的出现给分布式计算领域带来了重大影响,其力量源于它的数据独立性[1]XML是纯数据描述,与编程语言、操作系统或传输协议无关,从而将数据从以代码为中心的基础结构所产生的约束中解放出来,让数据能够在Web上更自由的流通。

然而XML本身只是以纯文本对数据进行编码的一种格式,要想利用XML,或者说利用XML文件中所编码的数据,必须先将数据从纯文本中解析出来,因此,必须有一个能够识别XML文档中信息的解析器,用来解释XML文档并提取其中的数据。然而,根据数据提取的不同需求,又存在着多种解析方式,不同的解析方式有着各自的优缺点和适用环境。选择合适的XML解析技术能够有效提升应用系统的整体性能,因此,了解和区分各种不同的XML解析技术就显得尤为重要。

2 XML解析技术分析

所有的XML处理都从解析开始,无论是使用XSLTJava语言,第一步都是要读入XML文件,解码结构和检索信息等等,这就是解析,即把代表XML文档的一个无结构的字符序列转换为满足XML语法的结构化组件的过程。

2.1 XML解析技术的分类

根据从XML中获取数据的简易性,性能和最终所得到的数据模型的不同,XML解析技术大致可分为以下四类:

1)      面向文档的流式解析;

2)      面向文档的对象式解析;

3)      面向文档的指针式解析;

4)      面向应用的对象式解析;

这四类解析技术分别处于不同的抽象层次,适用于不同的应用场景,有着各自的优缺点。针对具体的应用需求,选择合适的解析技术,往往能够减少内存消耗,缩短处理时间,更方便地获取数据,提高应用系统的整体性能。

2.2面向文档的流式解析技术

流式解析是一种基于事件的解析过程,解析器顺序读取XML文档,产生一个对应的事件流,并向事件处理程序发送所捕获的各种事件,如元素开始和元素结束等,而事件处理程序则通过不同的方法处理这些事件。

流式解析是将XML文 档作为一个数据流来处理,因此,它具有类似于流媒体的优点,能够立即开始读取数据,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查 数据,不需要将整个文档一次加载到内存中,使得在处理大型文档时具有较好的时间和空间上的效率。然而效率的代价是易用性的降低,流式解析编程较为复杂,程 序员需要负责更多的操作。并且由于应用程序没有以任何方式存储数据,所以使得更改数据或在数据流中往后移是不可能的。再加上它的单遍解析特性,意味着它也 不支持随机访问。

流式解析又分为两种解析方式:推式解析(SAX)和拉式解析(StAX)。这两种方式的主要区别在于是由解析器还是应用程序控制读循环(读入文件的循环)

2.2.1推式解析(SAX解析技术)

SAX(Simple API for XML)解析技术就是一种推式解析,在这种解析方式中,解析器控制着读循环,在文档结束之前控制权不会返回给应用程序[3]。解析器通过回调的方式进行数据处理。

SAX提供了一个用于处理XML的,基于事件驱动的简单API。它的设计开始于XML-DEV邮件列表成员间的讨论,他们开发出的第一个接口草案SAX1.019981月发布,其后在20005月发布了SAX2.0,目前最新版本是20044月发布的SAX2.0.2SAX没有经过官方的标准机构认可,它不由W3C联盟或其它任何官方机构维护(现在,SAXDavid Megginson维护)[4],但它被广泛使用并视为XML社区事实上的标准。SAX最初是为Java而定义的,但也可以用于PythonPerlC++等其它语言。

SAX是基于事件驱动的,即SAX解析器在读取XML文档的过程中生成一个事件流,并且对于每个事件通过回调事件处理程序中相应的方法来进行处理。比如元素开始和结束标记,元素内容,实体,语法分析错误等事件。针对下面的简单XML文档,所产生的事件如图1所示,注意针对元素内的空格或回车也会生成一个文本事件。

1 SAX解析器生成的事件

SAX中的核心事件处理程序是一个实现了ContentHandler接口的类。此接口中定义了处理与XML文档本身关联的事件的方法,如startDocumentendDocumentstartElementendElementCharacters

SAX解析技术具有所有流式解析技术的优点和缺点,但是由于在整个解析过程中,解析器掌握着控制权直到文档结束,应用程序很难在获得所需的部分数据后停止解析过程(可以通过抛出异常的方式终止解析过程,但较为复杂,而且终止后也无法继续解析过程),因此产生了由应用程序掌握控制权的拉式解析方式。

2.2.2拉式解析(StAX解析技术)

StAX(Streaming API for XML)解 析技术是一种拉式解析,在这种解析方式中,应用程序控制着读循环。循环中,应用程序负责反复调用解析器获得下一个事件,直到文档结束。通过保留解析过程的 控制权,可以简化调用代码来准确地处理它预期的内容,并且可随时停止解析。此外,由于该方式没有基于处理程序回调,应用程序也不需要像SAX中那样模拟解析器的状态。

StAX针对同样的XML文档所获得事件类型和SAX基本相同,但是StAX包含了两套处理XMLAPI:基于指针的API和基于迭代器的API,分别提供了不同程度的抽象[5]

基于指针的API简单的返回事件,此时事件用数值形式来表示。这是一种低层API,没有提供底层XML结构的抽象,所有的状态信息直接从流读取器获得,不需要创建额外的对象。从而节约内存,拥有较高的效率。

而较为高级的基于迭代器的API则以对象方式返回事件,每个事件对象都封装了它所表示的特定XML结构固有的信息,因此可直接利用其方法获得属于该结构的信息,但也需要额外的对象创建开销。相对于基于指针的API,基于迭代器的API具有更多的面向对象特征,因此更便于应用于模块化的体系结构。

StAX也是用Java定义的,其StAX1.020043月发布,并且成为了JSR-173规范,最新版本为20066月发布的StAX1.2StAX作为用Java语言处理XML的最新标准,比早期出现的XPP (Xml Pull Parser)拉式解析器功能更为强大,也得到了更为广泛的应用。

2.3面向文档的对象式解析技术

由于流式解析方式固有的无法更改数据和不支持随机访问特性,尤其是没有对XML文档的结构建模,使得应用程序很难对XML文档进行搜索、修改、添加和删除等操作。为了解决这些问题,产生了面向文档的对象式解析技术--DOM

DOM(Document Object Model)是用与平台和语言无关的方式对XML文档进行建模的官方W3C标准[6],其目标是提供一个可以通用于各种程序语言、操作系统和应用程序的接口。DOM最初被当作Web浏览器识别和处理页面元素的方式,即在W3C介入之前的功能,称为“DOM Level 0W3C199810月提出了“DOM Level 1建议,支持XML1.0HTML处理。随后于200011月提出了“DOM Level 2建议,对Level 1进行了扩展,支持XML1.0、命名空间和CSS,也支持用户接口和树形操作事件,并且添加了DOM树形操作功能。最新的“DOM Level 3建议于20036月提出,在level 2的基础上添加了对DTDXML模式和XPath的支持[1]

DOM作为一种对象式解析技术,定义了层次化对象模型来表示XML文档。即为XML语法中的每个概念(如元素,属性,实体,文档等)定义对应的类,而解析器在读入XML文档的时候,会建立XML语法和类之间的一一映射。实际上,DOM的层次化对象模型是一个树形结构,它将一个XML文档看作一棵节点树,每个节点代表一个XML文档中的元素。DOM的基本节点对象有5[1](1)Document对象:是树的最高节点,也是对整个文档操作的入口;(2)ElementAttr对象:对文档中元素和元素属性的映射;(3)Text对象:作为ElementAttr对象的子节点,代表了元素或属性的文本内容;(4)NodeList对象:对节点按指定的方式进行遍历。

TAG:

 

评分:0

我来说两句

日历

« 2024-04-24  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 34155
  • 日志数: 51
  • 建立时间: 2013-05-02
  • 更新时间: 2013-11-15

RSS订阅

Open Toolbar