日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開(kāi)發(fā)Android → android解析xml文件的SAX方式:Simple API for XML

      android解析xml文件的SAX方式:Simple API for XML

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2011/4/15 16:50:04字體大。A-A+

      作者:西西點(diǎn)擊:639次評(píng)論:6次標(biāo)簽: xml

      • 類型:下載工具大。828KB語(yǔ)言:中文 評(píng)分:7.5
      • 標(biāo)簽:
      立即下載

       上一節(jié)中,我們使用DOM方式解析xml文檔,該方式比較符合我們?nèi)粘K季S方式,容易上手,但是它直接把文檔調(diào)入內(nèi)存中,比較耗內(nèi)存。在這里我們可以用另外一種方式解析xml,這個(gè)就是SAX方式。

      SAX即是:Simple API for XML

      SAX是基于事件驅(qū)動(dòng)的。當(dāng)然android的事件機(jī)制是基于回調(diào)函數(shù)的,在用SAX解析xml文檔時(shí)候,在讀取到文檔開(kāi)始和結(jié)束標(biāo)簽時(shí)候就會(huì)回調(diào)一個(gè)事件,在讀取到其他節(jié)點(diǎn)與內(nèi)容時(shí)候也會(huì)回調(diào)一個(gè)事件。

      既然涉及到事件,就有事件源,事件處理器。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通過(guò)parser()方法來(lái)解析XML文檔,并產(chǎn)生事件。事件處理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個(gè)接口

      XMLReader通過(guò)相應(yīng)事件處理器注冊(cè)方法setXXXX()來(lái)完成的與ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個(gè)接口的連接,詳細(xì)介紹請(qǐng)見(jiàn)下表:

      但是我們無(wú)需都繼承這4個(gè)接口,SDK為我們提供了DefaultHandler類來(lái)處理,DefaultHandler類的一些主要事件回調(diào)方法如下:

      由以上可知,我們需要XmlReader 以及DefaultHandler來(lái)配合解析xml。

      處理思路是:

      1:創(chuàng)建SAXParserFactory對(duì)象

      2: 根據(jù)SAXParserFactory.newSAXParser()方法返回一個(gè)SAXParser解析器
      3:根據(jù)SAXParser解析器獲取事件源對(duì)象XMLReader
      4:實(shí)例化一個(gè)DefaultHandler對(duì)象

      5:連接事件源對(duì)象XMLReader到事件處理類DefaultHandler中

      6:調(diào)用XMLReader的parse方法從輸入源中獲取到的xml數(shù)據(jù)

      7:通過(guò)DefaultHandler返回我們需要的數(shù)據(jù)集合。

      代碼如下:

      View Code

      
      

      public List<River> parse(String xmlPath){
      List<River> rivers=null;
      SAXParserFactory factory=SAXParserFactory.newInstance();
      try {
      SAXParser parser=factory.newSAXParser();
      //獲取事件源
      XMLReader xmlReader=parser.getXMLReader();
      //設(shè)置處理器
      RiverHandler handler=new RiverHandler();
      xmlReader.setContentHandler(handler);
      //解析xml文檔
      //xmlReader.parse(new InputSource(new URL(xmlPath).openStream()));
      xmlReader.parse(new InputSource(this.context.getAssets().open(xmlPath)));
      rivers=handler.getRivers();
      } catch (ParserConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      } catch (SAXException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      } catch (IOException e) {
      e.printStackTrace();
      }

      return rivers;
      }

       重點(diǎn)在于DefaultHandler對(duì)象中對(duì)每一個(gè)元素節(jié)點(diǎn),屬性,文本內(nèi)容,文檔內(nèi)容進(jìn)行處理。

       前面說(shuō)過(guò)DefaultHandler是基于事件處理模型的,基本處理方式是:當(dāng)SAX解析器導(dǎo)航到文檔開(kāi)始標(biāo)簽時(shí)回調(diào)startDocument方法,導(dǎo)航到文檔結(jié)束標(biāo)簽時(shí)回調(diào)endDocument方法。當(dāng)SAX解析器導(dǎo)航到元素開(kāi)始標(biāo)簽時(shí)回調(diào)startElement方法,導(dǎo)航到其文本內(nèi)容時(shí)回調(diào)characters方法,導(dǎo)航到標(biāo)簽結(jié)束時(shí)回調(diào)endElement方法。

       根據(jù)以上的解釋,我們可以得出以下處理xml文檔邏輯:

      1:當(dāng)導(dǎo)航到文檔開(kāi)始標(biāo)簽時(shí),在回調(diào)函數(shù)startDocument中,可以不做處理,當(dāng)然你可以驗(yàn)證下UTF-8等等。

      2:當(dāng)導(dǎo)航到rivers開(kāi)始標(biāo)簽時(shí),在回調(diào)方法startElement中可以實(shí)例化一個(gè)集合用來(lái)存貯list,不過(guò)我們這里不用,因?yàn)樵跇?gòu)造函數(shù)中已經(jīng)實(shí)例化了。

      3:導(dǎo)航到river開(kāi)始標(biāo)簽時(shí),就說(shuō)明需要實(shí)例化River對(duì)象了,當(dāng)然river標(biāo)簽中還有name ,length屬性,因此實(shí)例化River后還必須取出屬性值,attributes.getValue(NAME),同時(shí)賦予river對(duì)象中,同時(shí)添加為導(dǎo)航到的river標(biāo)簽添加一個(gè)boolean為真的標(biāo)識(shí),用來(lái)說(shuō)明導(dǎo)航到了river元素。

      4:當(dāng)然有river標(biāo)簽內(nèi)還有子標(biāo)簽(節(jié)點(diǎn)),但是SAX解析器是不知道導(dǎo)航到什么標(biāo)簽的,它只懂得開(kāi)始,結(jié)束而已。那么如何讓它認(rèn)得我們的各個(gè)標(biāo)簽?zāi)兀慨?dāng)然需要判斷了,于是可以使用回調(diào)方法startElement中的參數(shù)String localName,把我們的標(biāo)簽字符串與這個(gè)參數(shù)比較下,就可以了。我們還必須讓SAX知道,現(xiàn)在導(dǎo)航到的是某個(gè)標(biāo)簽,因此添加一個(gè)true屬性讓SAX解析器知道。因此

      5:它還會(huì)導(dǎo)航到文本內(nèi)標(biāo)簽,(就是<img></img>里面的內(nèi)容),回調(diào)方法characters,我們一般在這個(gè)方法中取出就是<img></img>里面的內(nèi)容,并保存。

      6:當(dāng)然它是一定會(huì)導(dǎo)航到結(jié)束標(biāo)簽</river> 或者</rivers>的,如果是</river>標(biāo)簽,記得把river對(duì)象添加進(jìn)list中。如果是river中的子標(biāo)簽</introduction>,就把前面設(shè)置標(biāo)記導(dǎo)航到這個(gè)標(biāo)簽的boolean標(biāo)記設(shè)置為false.

      按照以上實(shí)現(xiàn)思路,可以實(shí)現(xiàn)如下代碼:

      View Code

      
      

      /**導(dǎo)航到開(kāi)始標(biāo)簽觸發(fā)**/
      public void startElement (String uri, String localName, String qName, Attributes attributes){
      String tagName=localName.length()!=0?localName:qName;
      tagName=tagName.toLowerCase().trim();
      //如果讀取的是river標(biāo)簽開(kāi)始,則實(shí)例化River
      if(tagName.equals(RIVER)){
      isRiver=true;
      river=new River();
      /**導(dǎo)航到river開(kāi)始節(jié)點(diǎn)后**/
      river.setName(attributes.getValue(NAME));
      river.setLength(Integer.parseInt(attributes.getValue(LENGTH)));
      }
      //然后讀取其他節(jié)點(diǎn)
      if(isRiver){
      if(tagName.equals(INTRODUCTION)){
      xintroduction=true;
      }else if(tagName.equals(IMAGEURL)){
      ximageurl=true;
      }
      }
      }

      /**導(dǎo)航到結(jié)束標(biāo)簽觸發(fā)**/
      public void endElement (String uri, String localName, String qName){
      String tagName=localName.length()!=0?localName:qName;
      tagName=tagName.toLowerCase().trim();

      //如果讀取的是river標(biāo)簽結(jié)束,則把River添加進(jìn)集合中
      if(tagName.equals(RIVER)){
      isRiver=true;
      rivers.add(river);
      }
      //然后讀取其他節(jié)點(diǎn)
      if(isRiver){
      if(tagName.equals(INTRODUCTION)){
      xintroduction=false;
      }else if(tagName.equals(IMAGEURL)){
      ximageurl=false;
      }
      }
      }

      //這里是讀取到節(jié)點(diǎn)內(nèi)容時(shí)候回調(diào)
      public void characters (char[] ch, int start, int length){
      //設(shè)置屬性值
      if(xintroduction){
      //解決null問(wèn)題
      river.setIntroduction(river.getIntroduction()==null?"":river.getIntroduction()+new String(ch,start,length));
      }else if(ximageurl){
      //解決null問(wèn)題
      river.setImageurl(river.getImageurl()==null?"":river.getImageurl()+new String(ch,start,length));
      }
      }

      運(yùn)行結(jié)果如下:

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門(mén)評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(6)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)