Android平臺上可以使用 Simple API for XML (SAX), Document Object Model(DOM) 和Android 附帶的pull解析器 解析XML文件
眾所周知,DOM解析方式很耗內存, 優先使用SAX或者pull
SAX:
解析速度快,占用內存少,采用事件驅動,即不需要加載完整個文檔,而是按內容順序解析文檔,在此過程中,其會判斷當前讀到的內容是否符合XML語法定義,如果符合就會觸發事件,所謂事件,其實就是一些callback方法,具體方法含義比較簡單, 看文檔即可,定義在DefaultHandler接口中(SAX已內置到JDK5.0中)
待解析xml文件musics.xml:
xml version=“1.0” encoding=“utf-8”?>
黑色幽默name>
JayalbumName>
2000year>
music>
愛在西元前name>
范特西albumName>
2001year>
music>
回到過去name>
八度空間albumName>
2002year>
music>
東風破name>
葉惠美albumName>
2003year>
music>
七里香name>
七里香albumName>
2004year>
music>
一路向北name>
十一月的蕭邦albumName>
2005year>
music>musics>
實體類MusicEntity就不貼了,四個屬性,上面的xml中也可以看出。
實現了DefaultHandler接口的SaxHandler:
public class SaxHandler extends DefaultHandler{
private static final String TAG = “lanyan”;
private List musics;
private MusicEntity music;
//緩存上一次的標簽名
private String preTag;
@Override
public void startDocument() throws SAXException {
musics = new ArrayList();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (“music”.equals(localName)) {
music = new MusicEntity();
music.setId(Integer.parseInt(attributes.getValue(“id”)));
}
preTag = localName;
}
/**
* 解析到文檔中字符內容時調用
* 所以一般網絡中傳輸的xml,其父節點與子節點之間是緊挨在一起的,基本上就是一行,看起來很混亂,其實是為了避免解析時無必要的調用
* 這里僅是測試,故忽略這個因素
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (null != music) {
String str = new String(ch, start, length);
if (“name”.equals(preTag)) {
music.setName(str);
} else if (“albumName”.equals(preTag)) {
music.setAlbumName(str);
} else if (“year”.equals(preTag)) {
music.setYear(Integer.parseInt(str));
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (“music”.equals(localName) && null != music) {
musics.add(music);
music = null;
}
preTag = null;
}
@Override
public void endDocument() throws SAXException {
}
public List getMusics() {
return musics;
}
}
對外提供SAX解析服務的接口SaxService:
public class SaxService {
public static List readXml(InputStream is) throws Exception {
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
SAXParser parser = saxFactory.newSAXParser();//
parser.setProperty(“http://xml.org/sax/features/namespaces”, true);
SaxHandler handler = new SaxHandler();
parser.parse(is, handler);
return handler.getMusics();
}
}
[1] [2] 下一頁
發表評論