標籤:檔案 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解析