所谓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>