xmldefaulthandlerparserandroidArrayAdapterSAXParserFactory android
SAX解析XML
SAX是Simple API for XML的缩写,SAX是基于事件驱动的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其它节点与内容时也会回调一个事件.事件源是org.xml.sax包中的XMLReader,它经过parser()方法来解析XML文档,并产生事件.事件处理器是DefaultHandler,与DOM比较而言,SAX是一种轻量型的方法.当须要一个速度快的解析器而且但愿最大限度的减小应用程序的内存占用时,一般能够使用SAX解析.
具体思路是:
*建立SAXParserFactory对象
SAXParserFactoryspf = SAXParserFactory.newInstance();
*根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器
SAXParsersp = spf.newSAXParser();
*根据SAXParser解析器获取事件源对象XMLReader
XMLReader reader = sp.getXMLReader();
*实例化一个DefaultHandler对象(StudentHandler是一事件处理器)
StudentHandler handler = newStudentHandler(students);
*链接事件源对象XMLReader到事件处理DefaultHander
reader.setContentHandler(handler);
*调用XMLReader的parse方法从输入源获取到xml数据
*经过DefaultHandler返回咱们须要的数据集合
注:重点在于DefaultHandler对象中对每个元素节点,属性,文本内容,文档内容的处理.
***************相关代码*******
//实例化一个DefaultHandler对象(StudentHandler是一事件处理器)
public class StudentHandler extends DefaultHandler {
private List<Student> mstudent;
private String mtagname;
private Student student;
public StudentHandler() {
super();
// TODO Auto-generated constructor stub
}
public StudentHandler(List<Student> mstudent) {
super();
this.mstudent = mstudent;
}
//开始解析文档
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
//解析xml文档结尾
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
//解析开始标签
//元素节点
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
this.mtagname = localName;
if("student".equals(mtagname)){
student = new Student();
student .setId(Integer.valueOf(attributes.getValue("id")));
}
else if("age".equals(mtagname)){
student .setAge(Integer.valueOf(attributes.getValue(0)));
}
super.startElement(uri, localName, qName, attributes);
}
//解析标签 结束
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
this.mtagname= localName;
if("student".equals(mtagname)){
mstudent.add(student);
student = null;
}
mtagname = "";
Log.i("TAG", "infor");
super.endElement(uri, localName, qName);
}
//解析文本标签
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String name = new String (ch,start,length);
if(!name.trim().equals("")&&"name".equals(mtagname)){
student.setName(name);
}
Log.i("TAG", "infor");
super.characters(ch, start, length);
}
}
*****************************sax解析*************
//student是一个实体类,有name,age,参数和构造方法,toString输出
public class SaxParserActivity extends Activity {
private TextView mtextview;
private ListView mlistview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.domparser);
mtextview = (TextView) findViewById(R.id.textView1);
mlistview = (ListView) findViewById(R.id.listView1);
mtextview.setText("sax解析xml");
List<Student> list = parser();
ArrayAdapter<Student> adapter = new ArrayAdapter<Student>(this,android.R.layout.simple_expandable_list_item_1,list);
mlistview.setAdapter(adapter);
}
private List<Student> parser() {
List <Student> list = new ArrayList<Student>();
try {
// 获取工厂
SAXParserFactory sax = SAXParserFactory.newInstance();
//获取sax解析器
SAXParser sf = sax.newSAXParser();
//获取事件源
XMLReader xmlreader = sf.getXMLReader();
//建立事件处理器
StudentHandler studenthandle = new StudentHandler(list);
// 将事件处理器设置到事件源
xmlreader.setContentHandler(studenthandle);
//触发解析事件,读取raw下面的文档
xmlreader.parse(new InputSource(getResources().openRawResource(R.raw.student)));
} catch (Exception e) {
// TODO Auto-generated catch block
Log.i("TAG",""+e.getMessage());
}
return list;
}
} dom