SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,它不需要解析完整个文档,而是按照内容顺序 看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法:
startDocument:当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作。
startElement: (String namespaceURI,String localName,String qName,Attributes atts)当遇开始标签的时候就会触发这个方法。
endElement(String uri,String localName,String name):当遇到结束标签时触发这个事件,调用此法可以做些善后工作。
charachers(char [] ch,int start,int length):当遇到xml内容时触发这个方法,用new String(ch,start,length)可以接受内容。
下面是一个例子:
文件名称:person.xml
<?xml version="1.0" encoding="UTF-8"?> <persons> <person> <name>李明</name> <age>30</age> </person> <person> <name>李向梅</name> <age>25</age> </person> </persons>
public class SAXService {
public List<Person> personService(InputStream inStream)throws Exception{
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
PersonDefaultHandler handler=new PersonDefaultHandler();
parser.parse(inStream, handler);
inStream.close();
return handler.getPersons();
}
private final class PersonDefaultHandler extends DefaultHandler{
private List<Person> persons=null;
private Person currentPerson;
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
private String tagName=null;
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tagName!=null){
String data =new String(ch,start,length);
if("name".equals(data)){
currentPerson.setName(data);
}else if("age".equals(data)){
currentPerson.setAge(Short.parseShort(data));
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("person".equals(localName)){
persons.add(currentPerson);
currentPerson=null;
}
tagName=null;
}
@Override
public void startDocument() throws SAXException {
persons=new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attr) throws SAXException {
if("person".equals(localName)){
currentPerson=new Person();
currentPerson.setId(Integer.parseInt(attr.getValue("id")));
}
tagName=localName;
}
}
}
下面是测试类:
public class PersonTest extends AndroidTestCase {
private static final String TAG="PersonTest";
public void testSAXService()throws Throwable{
SAXService saxservice=new SAXService();
InputStream inStream=this.getClass().getClassLoader().getResourceAsStream("person.xml");
List <Person> persons=saxservice.personService(inStream);
for(Person p:persons){
Log.i(TAG,p.toString());
}
}
}