標籤:android sax xml
所謂SAX,就是SAX simple API for XML,是一個解析XML檔案的簡單API。
SAX解析XML的工作原理,是對文檔進行順序掃描,當掃描到文檔開始與結束,元素開始與結束,觸發相應的響應函數。是一種事件驅動型的解析方式。它可以在解析文檔的任意時刻停止解析。
通過該圖我們可以大概瞭解解析的過程。
private void parse(String xmlString,List<Mp3Info> infos){ // SAXParserFactory 是一個使用原廠模式的類 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); try { XMLReader reader = saxParserFactory.newSAXParser().getXMLReader(); reader.setContentHandler(new Mp3ListContentHandler(infos)); reader.parse(new InputSource(new StringReader(xmlString))); }catch (Exception e) { e.printStackTrace(); }}
使用SAX解析XML檔案,首先要得到一個SAXParserFactory對象,然後得到一個XMLreader對象,再將自己實現的Contenthandler介面的類對象傳遞給XMLreader的setContenthandler方法,最後調用XMLreader的parse方法,將需要解析的XML檔案產生Inputsource放入即可。
解析XML檔案的關鍵在於自己實現Contenthandler這一介面的類,在這個類中,可以按照我們的需求來解析XML檔案,將不同標籤下的內容按照自己的需要使用、儲存。
/** * XML解析類,通過繼承DefualtHandler,並複寫該類中的方法解析XML檔案 * 這裡採用的是SAX解析方式,同時沒有選擇實現介面,而是通過adapt模式,繼承一個實現了ContentHandler介面的類 * @author 龍凱 * */public class Mp3ListContentHandler extends DefaultHandler { private List<Mp3Info> infos = null; private Mp3Info mp3Info = null; private String tagname = null; public Mp3ListContentHandler(List<Mp3Info> infos) { super(); this.infos = infos; } /* * (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int) * 處理檔案內容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { String info = new String (ch,start,length); if (tagname.equals("id")) { mp3Info.setId(info); } else if(tagname.equals("mp3.name")) { mp3Info.setMp3name(info); } else if (tagname.equals("mp3.size")) { mp3Info.setMa3size(info); } else if (tagname.equals("lrc.name")) { mp3Info.setLrcname(info); } else if (tagname.equals("lrc.size")) { mp3Info.setLrcsize(info); } } @Override public void endDocument() throws SAXException { super.endDocument(); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //如果結束標籤名為設定標籤名,實現特定的方法 if (localName.equals("resource")) { infos.add(mp3Info); } tagname = ""; } @Override public void startDocument() throws SAXException { } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 每次新解析到一個標籤時,識別標籤名,根據不同的標籤名,調用不同的方法 this.tagname = localName; if (tagname.equals("resource")) { mp3Info = new Mp3Info(); } }}
通過這個類,主要實現的是解析一個Mp3resource.XML檔案,通過該檔案讀出mp3檔案的名字,大小,id,以及歌詞lrc檔案的名字大小,儲存在一個list的list中。下面是XML檔案:
<?xml version="1.0" encoding="ISO-8859-1"?><resources> <resource> <id>0001</id> <mp3.name>a1.mp3</mp3.name> <mp3.size>10033011</mp3.size> <lrc.name>a1.lrc</lrc.name> <lrc.size>9053</lrc.size> </resource> <resource> <id>0002</id> <mp3.name>a2.mp3</mp3.name> <mp3.size>10033011</mp3.size> <lrc.name>a2.lrc</lrc.name> <lrc.size>9053</lrc.size> </resource></resources>
android之XML解析