Android解析XML文件的三方法(3)

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());
   }
}

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwsjsf.html