android sax解析相关理解

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;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值