SAX是一種事件驅動的XML API,特點:
流的方式處理,遇到標籤的時候不會記下標籤
分析能即刻開始,並可隨時結束
所佔內存小,適合大型文檔
示例xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person name="Claw" age="24">
<weight>70kg</weight>
<height>173cm</height>
</person>
<person name="Nancy" age="25">
<weight>54kg</weight>
<height>172cm</height>
</person>
<person name="dearcloud" age="27">
<weight>55kg</weight>
<height>172cm</height>
</person>
</persons>
使用方法:擴展defaultHandler實現解析細節,重寫主要的五個方法,實例代碼如下:
package com.example.xmlparser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxHandler extends DefaultHandler {
HashMap<String, String> map;
List<Map<String,String>> list;
private String curTag;//當前標籤
private String curValue;//當前值
private String nodeName;//當前節點名
public SaxHandler(String node) {
nodeName=node;
}
public List<Map<String, String>> getList() {
return list;
}
@Override
public void startDocument() throws SAXException {
list=new ArrayList<Map<String,String>>();
super.startDocument();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals(nodeName))
map=new HashMap<String, String>();
if(attributes!=null&&map!=null)
for(int i=0;i<attributes.getLength();i++){
map.put(attributes.getQName(i), attributes.getValue(i));
}
curTag=qName;
super.startElement(uri, localName, qName, attributes);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(curTag!=null&&map!=null){
curValue=new String(ch,start,length);
if(curValue!=null&&!curValue.trim().equals("")){
map.put(curTag, curValue);
}
}
super.characters(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(nodeName.equals(qName))
list.add(map);
super.endElement(uri, localName, qName);
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
有了這個DefaultHandler就可以解析了,解析類的靜態方法如下:
public static List<Map<String,String>> parseSax(InputStream is,String node){
try {
SAXParserFactory saxPF=SAXParserFactory.newInstance();
SAXParser saxParser=saxPF.newSAXParser();
SaxHandler saxHandler=new SaxHandler(node);
saxParser.parse(is, saxHandler);
return saxHandler.getList();
} catch (Exception e) {
Log.e("parse error", e.getMessage()+e.getLocalizedMessage());
return null;
}finally{
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如此,就可以用這個方法來解析xml文件了,使用示例如下:
String nodeName="person";
InputStream is=getResources().openRawResource(R.raw.parsed);
List<Map<String, String>> list=ParserUtil.parseSax(is, nodeName);