日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Android讀寫(xiě)XML(中)

系統(tǒng) 2265 0

注明:本文轉(zhuǎn)自 http://www.moandroid.com.

前面在 Android讀寫(xiě)XML(上)——package說(shuō)明 中,詳細(xì)介紹了使用 DOM方法讀取XML文檔,由于使用DOM方法需要將整個(gè)XML文檔加載內(nèi)存中,對(duì)系統(tǒng)資源占用比較多,這對(duì)內(nèi)存比較緊張的Android系統(tǒng)來(lái)說(shuō),使用DOM方法讀取XML文檔會(huì)有很大的限制。 使用SAX方法讀取XML,對(duì)內(nèi)存資源的占用的比較少,因此在嵌入式設(shè)備中極力推薦使用,Android也不例外,本篇幅詳細(xì)說(shuō)明Android中如何使用SAX讀取XML文檔。

SAX采用基于事件驅(qū)動(dòng)的處理方式,它將XML文檔轉(zhuǎn)換成一系列的事件,由單獨(dú)的事件處理器來(lái)決定如何處理。為了了解如何使用SAX API處理XML文檔,這里介紹一下SAX所使用的基于事件驅(qū)動(dòng)的處理模式。

基于事件驅(qū)動(dòng)的處理模式

基于事件的處理模式主要圍繞著 事件源 以及 事件處理器 來(lái)工作的。一個(gè)可以產(chǎn)生事件的對(duì)象被稱(chēng)為 事件源 ,而可以對(duì)事件產(chǎn)生響應(yīng)的對(duì)象就被叫做 事件處理器 。事件源與事件處理對(duì)象是通過(guò)在事件源中的事件注冊(cè)方法連接的。當(dāng)事件源產(chǎn)生時(shí)間后,調(diào)用事件處理器相應(yīng)的方法,一個(gè)事件獲得處理。當(dāng)在事件源調(diào)用事件處理器中特定方法的時(shí)候,會(huì)傳遞個(gè)事件標(biāo)志以及其響應(yīng)事件的狀態(tài)信息,這樣事件處理器才能夠根據(jù)事件信息來(lái)決定自己的行為。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通過(guò)parser()方法來(lái)開(kāi)始解析XML文檔,并根據(jù)文檔的內(nèi)容產(chǎn)生事件。而事件處理器則是org.xml.sax包中的ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個(gè)接口,它們分別處理事件源在解析XML文檔過(guò)程中產(chǎn)生的不同種類(lèi)的事件。而事件源XMLReader與這4個(gè)事件處理器的連接是通過(guò)在XMLReader中的相應(yīng)事件處理器注冊(cè)方法setXXXX()來(lái)完成的,詳細(xì)介紹請(qǐng)見(jiàn)下表:

以上的4個(gè)事件源處理器接口,在開(kāi)發(fā)中沒(méi)有必要直接從這4個(gè)接口直接繼承,因?yàn)閛rg.xml.sax.helper包為我們提供了類(lèi)DefaultHandler,其繼承了這4個(gè)個(gè)接口,在實(shí)際開(kāi)發(fā)中直接從DefaultHandler繼承并實(shí)現(xiàn)相關(guān)函數(shù)就可以了。在這4個(gè)接口中,最重要的是ContentHanlder接口,下面就其中的方法加以說(shuō)明,如下:

以上就是解析一個(gè)XML文檔,事件處理的過(guò)程。這里我們對(duì)org.xml.sax.XMLReader中的方法做下補(bǔ)充說(shuō)明:除了前面介紹的一系列事件處理器注冊(cè)方法set/getXXXX()外,還有個(gè)重要的函數(shù):parse(InputSource input)–Parse an XML document,開(kāi)始解析一個(gè)XML文檔。

按照應(yīng)用程序開(kāi)發(fā)的流程,簡(jiǎn)要介紹下SAX的使用方法

  1. 首先,編寫(xiě)了解XML文檔的結(jié)構(gòu),按照XML文檔的結(jié)構(gòu),編寫(xiě)具體的數(shù)據(jù)結(jié)構(gòu),類(lèi)似于:XXXXList,XXXXItem,最好與XML的文檔保持一致。
  2. 其次,開(kāi)始實(shí)現(xiàn)事件處理對(duì)象,Android SDK為我們提供了DefaultHandler,其繼承了ContentHandler 、DTDHandler、 EntityResolver、 ErrorHandler的所有接口。我們?cè)贒efaultHandler的基礎(chǔ)上,按照需求實(shí)現(xiàn)ContentHanlder的所有接口,這里需要注意2個(gè)方面的問(wèn)題:
    1. 事件處理的順序,處理時(shí)間的位置:一般在startDocument()初始化工作,在endDocument()中收尾的處理工作;startElement()—characters()—endDocument()是一個(gè)XML節(jié)點(diǎn)讀取的過(guò)程,startElement()用來(lái)初始判斷,characters()獲取節(jié)點(diǎn)的字符數(shù)據(jù),endDocument()將數(shù)據(jù)寫(xiě)入數(shù)據(jù)結(jié)構(gòu)。
    2. 異常SAXException的處理;
  3. 然后,XML實(shí)體解析,過(guò)程如下:
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    XMLReader xmlreader = parser.getXMLReader();
    URL rrl = new URL(urlstring);
    InputSource is = new InputSource(url.openStream());
    Xmlreader.setContentHanlder(XXXX);
    Xmlreader.parse(is);
  4. 最后,在Activity中顯示數(shù)據(jù),一般先將XML中讀取的數(shù)據(jù),選擇合適的Adaper對(duì)數(shù)據(jù)進(jìn)行封裝,然后使用ListView控件來(lái)顯示數(shù)據(jù)。

以上就是SAX讀取XML的過(guò)程,并顯示出最終的數(shù)據(jù)。以上需要注意的是SAXParserFactory ,SAXParser類(lèi)來(lái)自 javax.xml.parsers包中。

總結(jié)說(shuō)明

SAX讀取XML文檔的方法,占用內(nèi)存比較少,但是開(kāi)發(fā)流程相比DOM就復(fù)雜多了,具體采用哪種方法比較合適,大家可以在開(kāi)發(fā)的過(guò)程中來(lái)深刻體會(huì)之間的差別。

Android讀寫(xiě)XML(中)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 宁津县| 延川县| 海南省| 江门市| 固始县| 汨罗市| 射阳县| 河源市| 东平县| 沭阳县| 抚宁县| 大方县| 新余市| 元谋县| 金寨县| 达孜县| 临朐县| 囊谦县| 山东省| 韩城市| 嘉定区| 孟州市| 天峻县| 岳普湖县| 南漳县| 小金县| 日喀则市| 邯郸市| 工布江达县| 宜昌市| 荣成市| 金门县| 江阴市| 北辰区| 墨玉县| 富民县| 荣成市| 广西| 明星| 沙坪坝区| 浦城县|