中国·芯片交易在线
首页 | 供应信息 | 求购信息 | 库存查询 | 新闻中心 | 展会资讯 | IC厂商 | 技术资料 | 自由区域
   新闻首页 |  行业动态 | 新品发布 | 政策法规 | 科技成果 | 模拟技术 | 嵌入系统 | 传感控制 | 存储设计  
当前位置:IC72首页>> IC新闻中心>> 科技成果 >>电子行业新闻正文

XML语法特性在SAX中的应用研究

时间:2008/11/24 9:29:00  作者:  来源:ic72  浏览人数:1405
 
 

      1 引 言

      XML(Extensible Markup Language,可扩展性标记语言)由于其强大的对复杂数据的描述能力和广泛的适应性,已经逐渐地被广泛应用于各个领域。当前,用于解析XML文档的2种基本方式是DOM和SAX。其中DOM(Document Object Model)方式是首先将整个XML文档读人到内存形成一棵树状结构,应用程序可以用各种方法对该树进行遍历、插入、删除以及修改等操作。该方式有着信息量丰富,并且对其中的信息可以随机访问的优点。但是由于要将整个XML文档读入内存并生成一棵树,对于非常大的XML文档,DOM解析过程就十分缓慢,同时也会耗费大量的内存资源。

      SAX(Simply API for XML)采用的是一种基于事件驱动的处理模式,他的处理方式把XML文档中元素、属性、内容等都当成是事件,并且为每个事件都定义一个回调方法,这个回调方法由应用程序提供。解析器以数据流的方式读入XML,当遇到某个事件时就调用相应的回调方法。该方式并不会事先将XML文档读入内存,而是在读XML文档的过程中就开始对文档进行解析。其优点就是处理效率高,特别是适合大型的XML文档处理。但是对一些类似于查询元素在XML中的位置以圾元素的嵌套情况等与XML结构相关的操作,SAX显得有些困难。

      本文分析XML文档结构和语法规则特性,并且将这些特性应用到SAX解析XML文档中,利用栈数据结构来保存与XML结构相关的信息,通过对栈的分析解决类似查询元素位置和嵌套情况等问题,从而从一定程度上消除SAX在处理XML文档时所存在的不足。

      2 XML文档结构和语法特点

      XML是由W3C(World Wide Web Consortium,万维网协会)设计的一种可扩展的标记语言。相对HTML(Hyper Text Markup Language)语言,XML更侧重于如何结构化地描述所要表达的信息,并且有着严格的语法要求,因此结构更加的清晰,信息更便于阅读和维护。

      2.1 XML文档的结构

      XML文档采用树状的层次性结构,类似于层次性数据库系统。在层次性模型结构中,有且仅有一个节点没有任何父亲,这个节点称为根节点,除根节点外所有节点都有且仅有一个父节点,也就是说XML文档结构就像一个倒置的树。如图1所示是Student.xml文档的结构图。

      一般的XML文档由以下几个部分组成:XML声明、根元素、元素、属性以及注释等。其中属性和注释有时也可以没有。例1是名为Student.xml的XML文档:

      例1 一个XML文档代码为student.xml

ic72新闻中心

      其中是XML声明,其作用是告诉浏览器或者其他处理程序该文档是XML文档;其中version是XML文档的版本信息;encoding是内部信息的编码方式。而根元素部分是:

ic72新闻中心

      根元素是文档的主体部分,他包含文档的数据以及描述数据结构的信息。在根元素中,信息主要是以元素和属性的形式存储。

ic72新闻中心

      2.2 XML文档语法特性

      XML文档有着十分严格的语法规定,他必须遵循W3C所推荐规则规定的XML语法,这些语法的主要特性是:

      (1)XML文档中所有元素的标签(tag)都必须有相应的结束标签(ending tag)。也就是说开始标签和结束标签是成套出现的。例如:

ic72新闻中心

      其中所有标签都是封闭的,例如数据“Tom”包含在和</Name>标签对之间,其中是开始标签,</Name>是结束标签。

      (2)XML文档中所有元素都必须合理地嵌套,不容许交叉混乱的嵌套。例如:

ic72新闻中心

      该XML文档中元素的嵌套是层次分明合理的。又例如:

ic72新闻中心

      该XML文档中元素的嵌套就是不合理的,因为根元素Student和其子元素School Report Card中标签出现了交错嵌套。

      (3)XML文档必须包含一个容纳其他所有元素的根元素。例如在前面的Student.xml文档中,根元素是Student,他有惟一的一对标签和</Studen>来定义,所有子元素都必须合理的嵌套在内部。

      由于XML有着比较严格的语法要求,因此看起来整个文档更加的清晰、层次分明,一些基于XML文档的应用程序对他的处理相对来说也会更加的方便。

      3 SAX处理XML方式及其改进

      SAX(Simply API for XML)实际上是一个访问XML文档的Java接口,他是由XML-DEV邮件列表的成员开发维护的一个公共领域(Public Domain)软件,Java版本由David Megginson来维护。

      3.1 SAX处理XML的方式

      SAX采用的是一种基于事件驱动的XML处理方式,他将XML文档看成一系列的事件,对不同的事件采用不同的事件处理器来处理。这种基于事件的处理模式主要是围绕着事件源以及事件处理器(或者叫监听器)工作。事件源是一个能产生事件的对象,同时能够注册事件处理器并且向他们发送事件对象,而事件处理器是可以针对事件产生响应的对象。事件源和事件处理器之间是通过在事件源中的事件处理器注册方法来连接的,这样当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就得到了处理。

      在SAX中,事件源是org.xml.sax包中的XMLReader,当XML文档输入到XMLReader中后,他通过parse()方法来开始解析XML文档并根据文档内容产生事件。而事件处理器则主要是org.xml.sax包中的ContentHandler这个接口,在这个接口中有处理不同事件的方法(几个主要方法见表1)。而事件源XMLReader和这4个事件处理器的连接是通过在XMLReader中的相应的事件处理器注册方法setContentHandler()来完成。这样,事件源XMLReader通过这个注册方法就跟事件处理器ContentHandler联系起来,如图2所示。

ic72新闻中心

      以上可以看出,SAX处理XML文档过程其实是读入与解析几乎同步的过程,在读入XML文档的时候,SAX将XML看成一个数据流。当遇到某一特定的XML标签时相应地触发某一事件,然后调用相应的事件处理器,从而完成XML的处理。对于基于XML文档的应用程序,这种类似于流媒体的处理方式显得更加的灵活,应用程序不必解析整个XML文档,他可以在某个条件得到满足时候停止解析。同时由于是边读取边处理的方式,没必要将整个数据读入内存,这对于大型的XML文档的处理是一个大的优点。

      3.2 SAX存在的不足

      在SAX处理XML文档的方式中,事件处理器中每个事件处理方法都没有提供有关XML文档结构的信息,比如当前元素所在XML文档中的位置以及XML文档的嵌套情况等。但是,在许多的应用程序中,经常需要查询元素在XML文档中的位置以及元素的嵌套情况等与XML文档结构相关的信息,这时,应用SAX来处理显得十分吃力。

      3.3 在SAX处理XML文档中应用XML文档语法特性

      在2.2中知道XML文档的语法特性:完备的标签嵌套结构,每一个开始标签总会对应一个结束标签以及有且仅有一个根元素,也就是说XML文档有着良好的结构性。这样,可以考虑利用XML文档的这些特性,同时应用栈(stack)实现在DOM中才能实现的一些功能。

      栈(stack)是一种只容许在同一端进行插入/删除操作的表结构,在容许插入/删除的一端称为栈顶(top),另一段称为栈底(bottom),他的特点是后进先出(last in firstout)。对栈的操作主要有栈插入push(也称压栈)和栈删除pop(也称弹栈),而所有这些操作都在栈顶一端进行。利用栈来处理XML文档的算法思想是:

      在解析XML文档时,当遇到元素处理开始事件后,在相应的事件处理器中采取push操作将该元素标签压入到栈中,而当遇到元素处理结束事件后采取pop操作将该元素标签弹出栈。对于一个结构良好的XML文档来说,很容易知道所有push和pop操作都是成对出现的。这样只需要分析栈的结构就可以确定当前标签在XML文档中的具体位置,而栈中最大条目数就是该XML文档的最大嵌套层数,栈底就是整个XML的根节点。现在以表1中ContentHandler事件处理器为例实现该算法思想:

      ContentHandler事件处理器实际上是一个接口,现在来创建一个实现该接口的类,为了方便起见,在此只写表1了中所涉及到的几个主要的方法的实现。则用例2所示的Java来实现。要解析的是例1的Studenet.xml文档,假如现在想知道学生的年龄(age)以及该元素在文档中处理树结构中的位置,则用例2所示的Java程序实现。

      例2 算法思想的实现,代码为Mystudent XML java

ic72新闻中心

      这个方法是用来处理在XML文件中读到具体的数据字符串,他的参数是一个字符数组,以及读到的这个数据字符串在这个数组中的起始位置start和长度length。

ic72新闻中心

      该程序运行的结果是:

      元素Age的数据是:20,处于整个XML文档的第2层从上面程序中可以看出:栈中保存的是在解析文档过程中的标签名称,他是一个动态的数据结构,随着解析的进展而变化,通过分析栈的结构可以得到一些关于XML文档结构和元素在文档中位置的信息。其中代码:

ic72新闻中心

      是用来获得当前栈内元素个数,也就是当前数据data所在XML文档树状层次结构中的层次。此外,如果需要得到从根元素将当前元素的一条路径,则只要将当前栈内元素从底往上按顺序取出即可。增加代码如下:

      总的来说,改进后的方法是通过分析栈的结构获得元素所在XML,文档的位置以及当前元素的嵌套情况。代码中字符串数组变量datapath就是栈中元素从底向上的逐一排列,其实就是当前解析的元素在XML结构树中的一条从根元素到当前元素的惟一路径,同时也是当前元素在XML文档中的嵌套情况。

      4 结语

      本文将XML文档的语法特性应用于SAX对XML的处理中,同时利用栈这个常见的数据结构,很好地克服了SAX在处理XML文档时所存在的一些不足。尽管去维护栈也要花费一些工夫,但是对于那些处理大型的XML文档并且用户只对文档中部分信息有兴趣的应用程序来说,这些维护工夫相对于使用DOM方式来说是很值得的。

 
【相关文章】
·XML语法特性在SAX中的应用研究
 
 
IC新闻搜索
 
热点新闻
基于红外超声光电编码器的室内移动小车定位系
基于闪烁存储器的TMS320VC5409DSP并行引导装载方法
非移动市场需求飙升,ARM预计2010年出货量超50亿片
一种快速响应的电容式湿度传感器感湿薄膜设计
利用特殊应用模拟开关改进便携式设计
无线传感器网络跨层通信协议的设计
基于ARM9内核Processor对外部NAND FLASH的控制实现
基于GSM技术的汽车防盗系统的设计
热电阻在烟叶初烤炕房温度控制中的应用
高速数据转换系统对时钟和数据传输的性能要求
友情连接
 关于我们  IC论坛  意见反馈  设置首页  广告服务  用户帮助  联系我们
copyright:(1998-2005) IC72 中国·芯片交易在线
(北京)联系电话:(010)82614113、82614123 传真:(010)82614123 客户服务:service@IC72.com 库存上载:IC72@IC72.com
在线MSN咨询:ic72sale8@hotmail.com 通信地址:北京市西城区西直门内大街2号大厦15层 邮政编码:100013
(深圳)联系方式: 在线MSN咨询:ic72sale6@hotmail.com 在线QQ咨询:191232636 通信地址:深圳市福田区振华路
注 册 号: 1101081318959(1-1)

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9