posts - 101,  comments - 29,  trackbacks - 0

          <一>簡介

          什么是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:




          posted on 2012-04-02 14:52 mixer-a 閱讀(159) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 台安县| 溆浦县| 清涧县| 抚顺县| 迭部县| 浙江省| 汉源县| 澄江县| 启东市| 关岭| 封丘县| 阜宁县| 共和县| 青神县| 商丘市| 融水| 谢通门县| 称多县| 肇州县| 汕尾市| 本溪市| 福安市| 松潘县| 惠水县| 肃北| 潍坊市| 富宁县| 尼玛县| 贞丰县| 灵武市| 兴仁县| 北碚区| 达孜县| 屏山县| 封丘县| 成安县| 葵青区| 镇雄县| 白城市| 晋州市| 基隆市|