xml解析分为三种方式:sax,dom,pull。
sax,pull内存占用少,更适合于Android手机开发;pull编程方式较其他两种较为简洁;dom可随意访问任何一个结点;sax,pull是解析同步的,dom是解析好后供用户提取感兴趣的信息。
sax解析:
package com.hnust.util;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
import com.hnust.pojo.Person;
/***
* SAX解析的工具类
* @author zzg
*
*/
public class SAXForHandler extends DefaultHandler {
private static final String TAG="SAXForHandler";
private List<Person> persons;
private String perTag;//通过此变量记录前一个标签的名称
Person person;
public List<Person> getPerson(){
return persons;
}
//调用一次,适合一些初始化的动作
@Override
public void startDocument() throws SAXException{
persons=new ArrayList<Person>();
Log.i(TAG, "***startDoucemnt****");
}
/***
* 调用多次
*
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if("person".equals(localName)){
for(int i=0;i<attributes.getLength();i++){
Log.i(TAG,"attrName:"+attributes.getLocalName(i)+"_attrValue_:"+attributes.getValue(i));
person=new Person();
person.setId(Integer.valueOf(attributes.getValue(i)));
}
}
perTag=localName;
Log.i(TAG, qName+"***startElement****");
}
//调用多次
/***
* @param ch[] 当前读取到的字节数组
* @param start 字节开始的位置
* @param length 当前TextNode的长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
String data=new String(ch,start,length).trim();
if(!"".equals(data.trim())){
Log.i(TAG,"content:"+data.trim());
}
if("name".equals(perTag)){
person.setName(data);
}else if("age".equals(perTag)){
person.setAge(Integer.parseInt(data));
}
}
//调用多次
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
Log.i(TAG, qName+"***endElement****");
if("person".equals(localName)){
persons.add(person);
person=null;
}
perTag=null;//结束的时候必须为空
}
//调用一次
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
Log.i(TAG, "***endDoucemnt****");
}
}
package com.hnust.pojo;
public class Person {
private int id;
private String name;
private int age;
public Person(){};
public Person(int id,String name,int age){
this.id=id;
this.age=age;
this.name=name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "id="+id+",name="+name+",age="+age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
AssetManager asset=getAssets();
InputStream is=asset.open("person.xml");
List<Person> persons=null;
StringBuilder sb=new StringBuilder();
switch(v.getId()){
case R.id.sax_button:
//sax解析xml文件
SAXForHandler handler=new SAXForHandler();
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser parser=spf.newSAXParser();
parser.parse(is, handler);
persons=handler.getPerson();
for(Person person:persons){
sb.append(person.toString());
}
Toast.makeText(this, sb,1).show();
break;