<一>簡介
什么是SAX呢?以前只是聽說SAX,SAX的,但從未接觸,今天學(xué)習(xí)一下,順便做一下筆記。
SAX是Simple API for XML的縮寫,它既是一個(gè)接口也是一個(gè)包。
SAX是一個(gè)解析速度快并且占用內(nèi)存少的xml解析器,非常適合用于Android等移動(dòng)設(shè)備。 這個(gè)不同于DOM解析,DOM是把全部數(shù)據(jù)放入內(nèi)存進(jìn)行解析。
SAX解析XML文件采用的是事件驅(qū)動(dòng),也就是說,它并不需要解析完整個(gè)文檔。在按內(nèi)容順序解析文檔的過程中,SAX會判斷當(dāng)前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發(fā)事件。所謂事件,其實(shí)就是一些回調(diào)方法,這些方法定義在ContentHandler接口中。
另外一點(diǎn)就是:SAX在解析件的過程中得到自己需要的信息后可以隨時(shí)終止解析,并不一定要等文件全部解析完畢。
有優(yōu)勢必定優(yōu)劣勢:SAX采用的是流式處理方式,當(dāng)遇到某個(gè)標(biāo)簽的時(shí)候,它并不會記錄下以前所遇到的標(biāo)簽,也就是說,在處理某個(gè)標(biāo)簽的時(shí)候,比如在startElement方法中,所能夠得到的信息就是標(biāo)簽的名字和屬性,至于標(biāo)簽內(nèi)部的嵌套結(jié)構(gòu),上層標(biāo)簽、下層標(biāo)簽以及其兄弟節(jié)點(diǎn)的名稱等等與其結(jié)構(gòu)相關(guān)的信息都是不得而知的。實(shí)際上就是把XML文件的結(jié)構(gòu)信息丟掉了,如果需要得到這些信息的話,只能你自己在程序里進(jìn)行處理了。所以相對DOM而言,SAX處理XML文檔沒有DOM方便,SAX處理的過程相對DOM而言也比較復(fù)雜。
<二>ContentHandler接口常用的方法
startDocument()
當(dāng)遇到文檔的開頭的時(shí)候,調(diào)用這個(gè)方法,可以在其中做一些預(yù)處理的工作。
endDocument()
和上面的方法相對應(yīng),當(dāng)文檔結(jié)束的時(shí)候,調(diào)用這個(gè)方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName, String qName, Attributes atts)
當(dāng)讀到一個(gè)開始標(biāo)簽的時(shí)候,會觸發(fā)這個(gè)方法。namespaceURI就是命名空間,localName是不帶命名空間前綴的標(biāo)簽名,qName是帶命名空間前綴的標(biāo)簽 名。通過atts可以得到所有的屬性名和相應(yīng)的值。要注意的是SAX中一個(gè)重要的特點(diǎn)就是它的流式處理,當(dāng)遇到一個(gè)標(biāo)簽的時(shí)候,它并不會紀(jì)錄下以前所碰
到的標(biāo)簽,也就是說,在startElement()方法中,所有你所知道的信息,就是標(biāo)簽的名字和屬性,至于標(biāo)簽的嵌套結(jié)構(gòu),上層標(biāo)簽的名字,是否有子元屬 等等其它與結(jié)構(gòu)相關(guān)的信息,都是不得而知的,都需要你的程序來完成。這使得SAX在編程處理上沒有DOM來得那么方便。
endElement(String uri, String localName, String name)
這個(gè)方法和上面的方法相對應(yīng),在遇到結(jié)束標(biāo)簽的時(shí)候,調(diào)用這個(gè)方法。
characters(char[] ch, int start, int length)
這個(gè)方法用來處理在XML文件中讀到的內(nèi)容。例如:<name>xiaosi</name> 主要目的是獲取name標(biāo)簽中的值。
第一個(gè)參數(shù)用于存放文件的內(nèi)容,后面兩個(gè)參數(shù)是讀到的字符串在這個(gè)數(shù)組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內(nèi)容。
<?xml version="1.0"?> ---------->startDocument()
<student> ---------->startElement
<name> ---------->startElement
xiasoi ---------->characters
</name> ---------->endElement
<id> ---------->startElement
090105 ---------->characters
</id> ---------->endElement
</student> --------->endElement
文檔結(jié)束 --------->startDocument()
<三>解析步驟
使用SAX解析XML文件一般有以下五個(gè)步驟:
1、創(chuàng)建一個(gè)SAXParserFactory對象(通過類名很容易得知它利用工廠方法模式實(shí)現(xiàn)的);
2、調(diào)用SAXParserFactory中的newSAXParser方法創(chuàng)建一個(gè)SAXParser對象;
3、然后在調(diào)用SAXParser中的getXMLReader方法獲取一個(gè)XMLReader對象;
4、在XMLReader中注冊事件處理接口,一般有ContentHandler、ErrorHandler、DTDHandler、EntityHandler四種;
5、調(diào)用XMLReader中的parse方法解析指定的XML字符串對象;
具體實(shí)現(xiàn):
注意:因?yàn)镃ontentHandler是一個(gè)接口,在使用的時(shí)候有些不方便,需要全部實(shí)現(xiàn)所有的方法,但是有些方法我們會用不到。因此,SAX還為其制定了一個(gè)Helper類:DefaultHandler,它實(shí)現(xiàn)了這個(gè)接口,但是其所有的方法體都為空,在實(shí)現(xiàn)的時(shí)候,你只需要繼承這個(gè)類,然后重載相應(yīng)的方法即可
MyContentHandler: