Fork me on GitHub

android解析XML文件的三方法之SAX

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(tagName)){
                        currentPerson.setName(data);
                 }else if("age".equals(
tagName)){
                        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());
       }
}

}

posted @ 2011-02-27 23:16  Greenwood  阅读(258)  评论(0编辑  收藏  举报