SAX(Simple API for xml):它并不是由W3C官方提出的标准,是“民间”的事实标准。它是一种轻量型的方法。
DOM和SAX的区别:
DOM:在处理DOM时,需要读入整个XML文档,然后再内存中创建DOM树,生成DOM树上的每个NODE对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事。这时候,一个较好的替代解决方法就是SAX。
SAX:不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(CALLBACK)机制的程序运行方法。在XMLREADER接受XML文档,在读入XML文档的过程中就进行解析,也就是说读入文档的过程和解析的过程是同时进行的,这和DOM区别很大。解析开始之前,需要向XMLREADER注册一个CONTENTHANDLER,也就是相当于一个事件监听器,在CONTENTHANDLER中定义了很多方法,比如STARTDOCUMENT(),它定制了当在解析过程中,遇到文档开始时应该处理的事情。当XMLREADER读到合适的内容,就会抛出相应的事件,并把这个事件的处理权代理给CONTENTHANDLER,调用其相应的方法进行响应。
例如:下面一个XML文档
<POEM>
<AUTHOR>OGDEN NASH</AUTHOR>
<TITLE>FLEAS</TITLE>
<LINE>ADAM</LINE>
</POEM>
当XMLREADER读到<POEM>标签时,就会调用CONTENTHANDLER.STARTELEMENT()方法,并把标签名POEM作为参数传递过去。在你实现的STARTELEMENT()方法中需要做相应的动作,以处理当<POEM>出现时应该做的事情。各个事件随着解析的过程(也就是文档读入的过程)一个个顺序的被抛出,相应的方法也会被顺序的调用,最后,当解析完成,方法都被调用后,对文档的处理也就完成了。
CONTENTHANDLER实际上是一个接口,当处理特定的XML文件的时候,就需要为其创建一个实现了CONTENTHANDLER的类来处理特定的事件,可以说,这个实际上就是SAX处理XML文件的核心。
下面是ContentHandler接口中的一些方法:
void characters(char[] ch,int start,int length):用来处理在XML中读到字符串,它的参数是一个字符数组,以及读到的这个字符串在这个数组中的起始位置和长度,我们很容易用String类的一个构造方法来获得这个字符串的String类:String charencontered=new String(ch,start,length).
void startDocument():当遇到文档开头的时候,调用这个方法,可以在其中做一些预处理的工作。
void endDocument():与上面方法类似,当问到结束的时候,调用这个方法,可以在其中做一些善后的工作。
void startElement(String nameSpaceURI,String localName,String qName,Attributes atts):当读到一个开始标签时,会触发这个方法。nameSpaceURI是名域,localName是标签名,qName是标签的修饰前缀,当没有使用名域的时候,这两个参数都是Null,而atts是这个标签所包含的属性列表。通过ATTS,可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,在遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。
void endElement(String nameSpaceURI,Attributes atts):当遇到结束标签时,调用这个方法。
DOM编程相对简单,但是速度比较慢,占用内存多,而S AX编程复杂一些,但是速度快,占用内存少。所以,我们应该根据不同的环境选择使用不同的方法。大部分的XML应用基本都可以用它们来解决。需要特别说明的是,DOM和SAX其实都是语言无关的,并非JAVA所独有,也就是说,只要有相应的语言实现,DOM和SAX可以应用在任何面向对象的语言中。
原文链接:https://www.f2er.com/xml/299852.html