Android 之XML資料解析(2)—— SAX解析

來源:互聯網
上載者:User

標籤:檔案   pull   tac   相關   清空   sax   set   target   png   

(以下文章基本照抄郭霖大神的《第一行代碼》)

在Android之 解析XML檔案(1)—— Pull解析 中我們講了Pull方式解析XML檔案。今天講另外一種方式,SAX解析XML檔案。

首先還是先看代碼。

一、 SAX解析參考代碼

private void parseXMLWithSAX(String xmlData){    try{        SAXParserFactory factory = SAXParserFactory.newInstance();        XMLReader xmlReader = factory.newSAXParser().getXMLReader();        ContentHandler handler = new ContentHandler();        //將ContentHandler的執行個體設定到XMLReader中        xmlReader.setContentHandler(handler);        //開始執行解析        xmlReader.parse(new InputSource(new StringReader(xmlData)));    }catch(Exception e){        e.printStackTrace();    }}

這裡我們看到SAX解析看起來要比Pull解析簡潔明了很多。

 

二、 相關類簡介

1、 SAXParserFactory 

 SAXParserFactory 與 XmlPullParserFactory類相似。也是提供SAXParser 執行個體的一個工廠。

下面是Android API中對 SAXParserFactory類的定義。

下面是SAXParserFactory中定義的方法。代碼中使用到的 newInstance() 與 newSAXParser() 分別用於產生一個SAXParserFactory執行個體和產生一個SAXParser執行個體。

 

2、XMLReader

XMLReader是一個介面。通過它的setContentHandler()方法,可以設定解析事件的處理handler,通過parse()方法可以開始解析。

XMLReader的執行個體是通過SAXParser類的 getXMLReader()方法來擷取的。

 

3、ContentHandler

上訴代碼中ContentHandler類是我們自己寫的類,繼承自DefaultHandler類。DefaultHandler類是SAX2事件處理的預設基礎類。

它提供了在四個核心的SAX處理類中的所有回調的預設實現。我們可以繼承該類,在對應的方法中重寫我們的處理邏輯。

下面是Android API中對DefaultHandler類的描述。

我們繼承的DefaultHandler類 具體代碼如下:

public class ContentHandler extends DefaultHandler{        private String nodeName;    private StringBuilder id;    private StringBuilder name;    private StringBuilder version;        //初始化    @Override    public void startDocument() throws SAXException{        id = new StringBuilder();        name = new StringBuilder();        version = new StringBuilder();    }        @Override    public void startElement(String uri,String localName,        String qName,Attributes attributes) throws SAXException{            //記錄當前結點名            nodeName = localName;    }            @Override    public void characters(char[] ch,int start,        int length) throws SAXException{        //根據當前結點名判斷將內容添加到哪一個StringBuilder對象中        if("id".equals(nodeName)){            id.append(ch,start,length);        }else if("name".equals(nodeName)){            name.append(ch,start,length);        }else if("version".equals(nodeName)){            version.append(ch,start,length);        }    }        @Override    public void endElement(String uri,String localName,        String qName) throws SAXException{        if("app".equals(localName){            Log.d("ContentHandler","id is" + id.toString().trim());            Log.d("ContentHandler","name is" + name.toString().trim());            Log.d("ContentHandler","version is" + version.toString().trim());            //最後還要講StringBuilder清空            id.setLength(0);            name.setLength(0);            version.setLength(0);        }    }        @Override    public void endDocument throws SAXException{        }}

可以看到在ContentHandler這個處理類中對xml資料的處理方式與Pull解析是類似的。所以SAX解析只不過是將解析用到的方法封裝起來,代碼書寫的時候邏輯更為清晰。

 

綜上,使用SAX解析XML資料我們需要做以下幾步:

1、使用SAXParserFactory 類中的newInstance()方法擷取SAXParserFactory 類執行個體。

2、通過SAXParserFactory 類執行個體的newSAXParser()方法擷取SAXParser執行個體

3、通過SAXParser執行個體的getXMLReader()擷取XMLReader的執行個體

4、XMLReader執行個體調用setContentHandler(ContentHandler contentHandler)方法設定解析所需的處理事件

5、自訂一個類繼承自 DefaultHandler,重寫我們需要的方法(這些方法裡面是我們用於處理XML資料的邏輯)。

6、最後調用XMLReader的parse()方法解析資料。

 

Android 之XML資料解析(2)—— SAX解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.