SAX解析XML文件
一、SAX解析的优点
SAX解析是逐行解析XML,占用内存小,效率高,速度快,接下来通过一个小demo演示如何去通过sax解析xml
二、SAX解析流程
-
确定要解析的xml
<?xml version="1.0" encoding="utf-8"?>
<books xmlns:pre="www.fmerLin.com">
<pre:book id=01>
<name>tianlongbabu</name>
<version>23</version>
<time>1991</time>
</pre:book>
<pre:book id=02>
<name>shendiaoxianv</name>
<version>24</version>
<time>1994</time>
</pre:book>
</books> -
我们首先自定义类去继承Android为我们停供的ContextHandler接口的实现类DefaultHandler,以便我们能选择性实现我们需要的方法
ContextHandler接口常用方法解析
- startDocument() :读取文档开头时调用,可在此方法中进行预处理操作,比如:初始化bean类,或者容器
- endDocument() : 读取文档结束时调用,在此方法中进行结尾工作
- startElement() : 开始标签时触发
- endElment() : 结束标签时触发
-
characters() : 处理文件中读取到内容,即标签间内容,注意:标签后的空格及tab键也会被读取到。
public class MyHandler extends DefaultHandler {
private String TAG="MyHandler";
private String preTag ;//标志解析到哪一个节点
private List<BooksBean> booksDatas;
private BooksBean book;
private List<BooksBean> getBooks(){
return booksDatas;
}
@Override
public void startDocument() throws SAXException {
Log.d(TAG, "startDocument--开始解析");
booksDatas = new ArrayList<BooksBean>();
}
/*
uri: 命名空间
localName: 不带命名空间的标签前缀名
qName: 带命名空间的标签前缀名
attributes: 属性集合
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("books".equals(localName)){
book = new BooksBean();
book.setId(attributes.getValue("id"));
}
preTag=localName;
Log.d(TAG,"loaclName="+localName);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(book!=null){
String data = new String(ch, start, length);
if("name".equals(preTag)){
book.setName(data);
}else if("version".equals(preTag)){
book.setVersion(data);
}else if("time".equals(preTag)){
book.setTime(data);
}
}
Log.d(TAG, "DATA="+new String(ch, start, length));
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("book".equals(localName)&&book!=null){
booksDatas.add(book);
book=null;
}
preTag=null;
Log.d(TAG, "localName="+localName);
}
@Override
public void endDocument() throws SAXException {
LogUtils.d(TAG, "endDocument--结束解析");
}
}
-
建立要解析文本的bean类
public class BooksBean {
private String id;
private String name;
private String time;
private String version;
public String getVersion(){
return version;
}
public void setVersion(String version){
this.version=version;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
} -
开始使用我们的SAX解析
public List<BooksBean> doSAXParser(InputStream is) throws Exception{
SAXParserFactory saxParserF = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserF.newSAXParser();
MyHandler dh = new MyHandler();
saxParser.parse(is, dh);
is.close();
return dh.getBooks();
}