SAX解析xml

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 id="23"> <name>李明</name> <age>30</age> </person> <person id="20"> <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());
}
}

}

注:此文为转载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值