在android開發中,經常用到去解析xml文件,常見的解析xml的方式有一下三種:SAX、Pull、Dom解析方式。最近做了一個android版的CSDN閱讀器,用到了其中的兩種(sax,pull),今天對android解析xml的這三種方式進行一次總結。
xml示例(channels.xml)如下:
一、使用sax方式解析
基礎知識:
這種方式解析是一種基於事件驅動的api,有兩個部分,解析器和事件處理器,解析器就是XMLReader接口,負責讀取XML文檔,和向事件處理器發送事件(也是事件源),事件處理器ContentHandler接口,負責對發送的事件響應和進行XML文檔處理。
下面是ContentHandler接口的常用方法
public abstract void characters (char[] ch, int start, int length)
這個方法來接收字符塊通知,解析器通過這個方法來報告字符數據塊,解析器為了提高解析效率把讀到的所有字符串放到一個字符數組(ch)中,作為參數傳遞給character的方法中,如果想獲取本次事件中讀取到的字符數據,需要使用start和length屬性。
public abstract void startDocument () 接收文檔開始的通知
public abstract void endDocument () 接收文檔結束的通知
public abstract void startElement (String uri, String localName, String qName, Attributes atts) 接收文檔開始的標簽
public abstract void endElement (String uri, String localName, String qName) 接收文檔結束的標簽
在一般使用中為了簡化開發,在org.xml.sax.helpers提供了一個DefaultHandler類,它實現了
ContentHandler的方法,我們只想繼承DefaultHandler方法即可。
另外SAX解析器提供了一個工廠類:SAXParserFactory,SAX的解析類為SAXParser 可以調用它的parser方法進行解析。
1 public class SAXPraserHelper extends DefaultHandler {
2
3 final int ITEM = 0x0005;
4
5 List
list;
6 channel chann;
7 int currentState = 0;
8
9 public List getList() {
10 return list;
11 }
12
13 /*
14 * 接口字符塊通知
15 */
16 @Override
17 public void characters(char[] ch, int start, int length)
18 throws SAXException {
19 // TODO Auto-generated method stub
20 // super.characters(ch, start, length);
21 String theString = String.valueOf(ch, start, length);
22 if (currentState != 0) {
23 chann.setName(theString);
24 currentState = 0;
25 }
26 return;
27 }
28
29 /*
30 * 接收文檔結束通知
31 */
32 @Override
33 public void endDocument() throws SAXException {
34 // TODO Auto-generated method stub
35 super.endDocument();
36 }
37
38 /*
39 * 接收標簽結束通知
40 */
41 @Override
42 public void endElement(String uri, String localName, String qName)
43 throws SAXException {
44 // TODO Auto-generated method stub
45 if (localName.equals(item))
46 list.add(chann);
47 }
48
49 /*
50 * 文檔開始通知
51 */
52 @Override
53 public void startDocument() throws SAXException {
54 // TODO Auto-generated method stub
55 list = new ArrayList();
56 }
57
58 /*
59 * 標簽開始通知
60 */
61 @Override
62 public void startElement(String uri, String localName, String qName,
63 Attributes attributes) throws SAXException {
64 // TODO Auto-generated method stub
65 chann = new channel();
66 if (localName.equals(item)) {
67 for (int i = 0; i < attributes.getLength(); i++) {
68 if (attributes.getLocalName(i).equals(id)) {
69 chann.setId(attributes.getValue(i));
70 } else if (attributes.getLocalName(i).equals(url)) {
71 chann.setUrl(attributes.getValue(i));
72 }
73 }
74 currentState = ITEM;
75 return;
76 }
77 currentState = 0;
78 return;
79 }
80 }
1 private List getChannelList() throws ParserConfigurationException, SAXException, IOException
2 {
3 //實例化一個SAXParserFactory對象
4 SAXParserFactory factory=SAXParserFactory.newInstance();
5 SAXParser parser;
6 //實例化SAXParser對象,創建XMLReader對象,解析器
7 parser=factory.newSAXParser();
8 XMLReader xmlReader=parser.getXMLReader();
9 //實例化handler,事件處理器
10 SAXPraserHelper helperHandler=new SAXPraserHelper();
11 //解析器注冊事件
12 xmlReader.setContentHandler(helperHandler);
13 //讀取文件流
14 InputStream stream=getResources().openRawResource(R.raw.channels);
15 InputSource is=new InputSource(stream);
16 //解析文件
17 xmlReader.parse(is);
18 return helperHandler.getList();
19 }
從第二部分代碼,可以看出使用SAX解析XML的步驟:
1、實例化一個工廠SAXParserFactory
2、實例化SAXPraser對象,創建XMLReader 解析器
3、實例化handler,處理器
4、解析器注冊一個事件
5、讀取文件流
6、解析文件
二、使用pull方式解析
基礎知識:
在android系統中,很多資源文件中,很多都是xml格式,在android系統中解析這些xml的方式,是使用pul解析器進行解析的,它和sax解析一樣(個人感覺要比sax簡單點),也是采用事件驅動進行解析的,當pull解析器,開始解析之後,我們可以調用它的next()方法,來獲取下一個解析事件(就是開始文檔,結束文檔,開始標簽,結束標簽),當處於某個元素時可以調用XmlPullParser的getAttributte()方法來獲取屬性的值,也可調用它的nextText()獲取本節點的值。
1 private List