您的位置:首页 > 其它

XML第十六讲:SAX方式解析XML文档深入详解

2013-03-29 11:54 387 查看
    前面我讲到了两种解析XML的方法,一种是DOM解析,另外一种是SAX解析,DOM解析我们已经剖析过了,现在我们来讲一下SAX解析

1.
SAX(Simple APIs for XML),面向XML的简单APIs。

2. 比较一下两种解析方式的不同

   使用DOM解析XML时,首先将XML文档加载到内存当中,然后可以通过随机的方式访问内存中的DOM树;SAX是基于事件而且是顺序执行的,一旦经过了某个元素,我们就没有办法再去访问它了,SAX不必事先将整个XML文档加载到内存当中,因此它占据内存要比DOM小,对于大型的XML文档来说,通常会使用SAX而不是DOM进行解析,主要是防止内存溢出的发生。

3. SAX依然用的观察者模式,(类似于GUI中的事件),在解析XML的过程中遇到一个标签,则执行相应的事件。

    SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

    SAX分析器在对XML文档进行分析时,触发了一系列的事件,由于事件触发本身是有时序性的,因此,SAX提供的是一种顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。SAX之所以被叫做"简单"应用程序接口,是因为SAX分析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX分析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分、是否符合XML语法,然后再触发相应的事件,而事件处理函数本身则要由应用程序自己来实现。同DOM分析器相比,SAX分析器缺乏灵活性。然而,由于SAX分析器实现简单,对内存要求比较低,因此实现效率比较高,对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX分析器更为合适。
  
[说明]:我们所要做的事情就是针对不同的回调,把里面的方法该实现的实现出来。

4. SAX分析器的大体构成框架



   图中最上方的SAXParserFactory用来生成一个解析器实例(也就是类似DOM解析器中的解析器工厂)。XML文档是从左侧箭头所示处读入,当解析器对文档进行分析时,就会触发在DocumentHandler,ErrorHandler,DTDHandler以及EntityResolver接口中定义的回调方法。

5. SAX基础

1)SAX是事件驱动的,文档的读入过程就是SAX的解析过程。

2)在读入的过程中,遇到不同的项目,解析器会调用不同的处理方法。



    可以对比一下GUI中的按钮触发事件,SAX解析跟那个道理是一模一样的。

6. 下面我们来查看JDK文档中了解一下常用的事件处理方法

1)创建工厂,和DOM类似,SAXParserFactory 也是一个抽象类。调用SAXParserFactory类的newInstance()方法,返回
SAXParserFactory 的实例。

public
abstract class SAXParserFactory extends Object

   Defines a factory API that enables applications to configure and obtain a SAX based parser to parse XML documents.

public
static SAXParserFactory newInstance()

  
Obtain a new instance of a SAXParserFactory.

2) 调用SAXParserFactory的newSAXParser()得到SAX的解析器

public
abstract SAXParser newSAXParser() throws ParserConfigurationException, SAXException
   Creates a new instance of a SAXParser using the currently configured factory parameters.

3)通过parse()方法就可以读入XML,这里面还有一个DefaultHandler参数,默认使用SAX的处理器。

    public void parse(File
f, DefaultHandler dh) throws SAXException, IOException

      Parse the content of the file specified as XML using the specified DefaultHandler.

    Parameters:

      f - The file containing the XML to parse

      dh - The SAX DefaultHandler to use.

4)进入DefaultHandler
类里面,可以发现有很多通知触发解析事件的方法:

  
startDocument():接受文档开始的通知。

public
void startDocument()throws SAXException

   Receive notification of the beginning of the document.

endDocument():接受文档结束的通知

public
void endDocument() throws SAXException
  
Receive notification of the end of the document.

startElement():
接受元素开始的通知

public void startElement(String uri,String localName,String qName, Attributes attributes)throws
SAXException

   Receive notification of the start of an element.

characters():
接受元素中间内容的通知。它会讲文本内容转换为字符串

public
void characters(char[] ch, int start,int length)throws SAXException

   Receive notification of character data inside an element.



        图表示:org.xml.sax.helpers.DefaultHandler类的方法

下一讲 :代码实现SAX解析XML具体使用用法我们将深入讲解SAX解析XML的用法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: