众所周知,DOM解析方式很耗内存, 优先使用SAX或者pull
SAX:
解析速度快,占用内存少,采用事件驱动,即不需要加载完整个文档,而是按内容顺序解析文档,在此过程中,其会判断当前读到的内容是否符合XML语法定义,如果符合就会触发事件,所谓事件,其实就是一些callback方法,具体方法含义比较简单, 看文档即可,定义在DefaultHandler接口中(SAX已内置到JDK5.0中)
待解析xml文件musics.xml:
xml version=“1.0” encoding=“utf-8”?>
music>
music>
music>
music>
music>
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();
}
}