我的位置: 首頁 > 學習專區(qū) > 安卓技術 > Android使用SAX讀取XML文件

Android使用SAX讀取XML文件

2012-02-02 11:07:00
來源:
[導讀] SAX是一個解析速度快并且占用內存少的xml解析器,非常適合用于Android等移動設備。 SAX解析XML文件采用的是事件驅動,也就是說,它并不需
SAX是一個解析速度快并且占用內存少的xml解析器,非常適合用于Android等移動設備。 SAX解析XML文件采用的是事件驅動,也就是說,它并不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發(fā)事件。所謂事件,其實就是一些回調(callback)方法,這些方法(事件)定義在ContentHandler接口。下面是一些ContentHandler接口常用的方法:

startDocument()

當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。

endDocument()

和上面的方法相對應,當文檔結束的時候,調用這個方法,可以在其中做一些善后的工作。

startElement(String namespaceURI, String localName, String qName, Attributes atts)

當讀到一個開始標簽的時候,會觸發(fā)這個方法。namespaceURI就是命名空間,localName是不帶命名空間前綴的標簽名,qName是帶命名空間前綴的標簽名。通過atts可以得到所有的屬性名和相應的值。要注意的是SAX中一個重要的特點就是它的流式處理,當遇到一個標簽的時候,它并不會紀錄下以前所碰到的標簽,也就是說,在startElement()方法中,所有你所知道的信息,就是標簽的名字和屬性,至于標簽的嵌套結構,上層標簽的名字,是否有子元屬等等其它與結構相關的信息,都是不得而知的,都需要你的程序來完成。這使得SAX在編程處理上沒有DOM來得那么方便。

endElement(String uri, String localName, String name)

這個方法和上面的方法相對應,在遇到結束標簽的時候,調用這個方法。

characters(char[] ch, int start, int length)

這個方法用來處理在XML文件中讀到的內容,第一個參數(shù)用于存放文件的內容,后面兩個參數(shù)是讀到的字符串在這個數(shù)組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內容。

只要為SAX提供實現(xiàn)ContentHandler接口的類,那么該類就可以得到通知事件(實際上就是SAX調用了該類中的回調方法)。因為ContentHandler是一個接口,在使用的時候可能會有些不方便,因此,SAX還為其制定了一個Helper類:DefaultHandler,它實現(xiàn)了這個接口,但是其所有的方法體都為空,在實現(xiàn)的時候,你只需要繼承這個類,然后重載相應的方法即可。使用SAX解析itcast.xml的代碼如下:

public static List readXML(InputStream inStream) {

try {

SAXParserFactory spf = SAXParserFactory.newInstance();

SAXParser saxParser = spf.newSAXParser(); //創(chuàng)建解析器

//設置解析器的相關特性,http://xml.org/sax/features/namespaces = true 表示開啟命名空間特性

saxParser.setProperty(“http://xml.org/sax/features/namespaces”,true);

XMLContentHandler handler = new XMLContentHandler();

saxParser.parse(inStream, handler);

inStream.close();

return handler.getPersons();

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

SAX 支持已內置到JDK1.5中,你無需添加任何的jar文件。XMLContentHandler的代碼:

import java.util.ArrayList;

import java.util.List;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

import cn.itcast.xml.domain.Person;

public class XMLContentHandler extends DefaultHandler {

private List persons = null;

private Person currentPerson;

private String tagName = null;//當前解析的元素標簽

public List getPersons() {

return persons;

}

/*

* 接收文檔的開始的通知。

*/

@Override public void startDocument() throws SAXException {

persons = new ArrayList();

}

/*

* 接收字符數(shù)據(jù)的通知。

*/

@Override public void characters(char[] ch, int start, int length) throws SAXException {

if(tagName!=null){

String data = new String(ch, start, length);

if(tagName.equals(“name”)){

this.currentPerson.setName(data);

}else if(tagName.equals(“age”)){

this.currentPerson.setAge(Short.parseShort(data));

}

}

}

/*

* 接收元素開始的通知。

* 參數(shù)意義如下:

* namespaceURI:元素的命名空間

* localName :元素的本地名稱(不帶前綴)

* qName :元素的限定名(帶前綴)

* atts :元素的屬性集合

*/

@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {

if(localName.equals(“person”)){

currentPerson = new Person();

currentPerson.setId(Integer.parseInt(atts.getValue(“id”)));

}

this.tagName = localName;

}

/*

* 接收文檔的結尾的通知。

* 參數(shù)意義如下:

* uri :元素的命名空間

* localName :元素的本地名稱(不帶前綴)

* name :元素的限定名(帶前綴)

*

*/

@Override public void endElement(String uri, String localName, String name) throws SAXException {

if(localName.equals(“person”)){

persons.add(currentPerson);

currentPerson = null;

}

this.tagName = null;

}

}

評論
熱點專題
>>
相關文章推薦
>>
好吊妞免费视频在线观看,久久亚洲国产人成综合网,久久精品国产2020,欧美精品综合在线
日韩综合永久久网 | 在线中文字幕亚洲日韩日本 | 午夜三A级免费在线视频 | 狼人青草久久网伊人 | 亚洲日韩小视频在线观看 | 亚洲第一视频在线观看播放 |