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

    前面我讲到了两种解析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分析器的大体构成框架

XML第十六讲:SAX方式解析XML文档深入详解_第1张图片

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

5. SAX基础

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

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

XML第十六讲:SAX方式解析XML文档深入详解_第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的用法。


你可能感兴趣的:(java)