XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。
下面来看一个pull解析xml的例子:
student.xml:
- <?xmlversion="1.0"encoding="utf-8"?>
- <root>
- studentid="1"group="1">
- name>张三</sex>男age>18email>zhangsan@163.combirthday>1987-06-08memo>好学生studentstudentid="2"group="2">李四>女>lisi@163.comstudentid="3"group="3">小王>xiaowang@163.comstudentid="4"group="4">小张>xiaozhang@163.comstudentid="5"group="5">小明>xiaoming@163.com>
对应的bean:
copy
publicclassStudent{
-
- privateintid;
- privateintgroup;
- privateStringname;
- privateStringsex;
- privateintage;
- privateStringemail;
- privateStringmemo;
- privateStringbirthday;
- publicintgetId(){
- returnid;
- }
- publicvoidsetId(intid){
- this.id=id;
- }
- publicintgetGroup(){
- returngroup;
- publicvoidsetGroup(intgroup){
- this.group=group;
- publicStringgetName(){
- returnname;
- publicvoidsetName(Stringname){
- this.name=name;
- publicStringgetSex(){
- returnsex;
- publicvoidsetSex(Stringsex){
- this.sex=sex;
- publicintgetAge(){
- returnage;
- publicvoidsetAge(intage){
- this.age=age;
- publicStringgetEmail(){
- returnemail;
- publicvoidsetEmail(Stringemail){
- this.email=email;
- publicStringgetMemo(){
- returnmemo;
- publicvoidsetMemo(Stringmemo){
- this.memo=memo;
- publicStringgetBirthday(){
- returnbirthday;
- publicvoidsetBirthday(Stringbirthday){
- this.birthday=birthday;
-
- }
主要的解析和现实类:
copy
importjava.io.InputStream;
- importjava.util.ArrayList;
- importjava.util.List;
- importorg.xmlpull.v1.XmlPullParser;
- importorg.xmlpull.v1.XmlPullParserFactory;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.Handler;
- importandroid.os.Message;
- importandroid.view.ViewGroup.LayoutParams;
- importandroid.widget.LinearLayout;
- importandroid.widget.TextView;
- publicclassPullActivityextendsActivityimplementsRunnable{
- privateTextViewpullTextView;
- privateLinearLayoutlayout;
- privateHandlerhandler=newHandler(){
- publicvoidhandleMessage(android.os.Messagemsg){
- ListStudent>lists=(List>)msg.obj;
- for(inti=0;ilists.size();i++){
- Studentstudent=lists.get(i);
- StringBuffersb=newStringBuffer();
- sb.append(student.getId()+"").append(student.getName()+"")
- .append(student.getAge()+"").append(student.getSex()+"").append(student.getBirthday()+"")
- .append(student.getEmail()+"").append(student.getGroup()+"");
- TextViewtxt=newTextView(getApplicationContext());
- txt.setLayoutParams(newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
- txt.setText(sb.toString());
- layout.addView(txt);
- };
- };
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- //TODOAuto-generatedmethodstub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.pull);
- pullTextView=(TextView)this.findViewById(R.id.pullTextView);
- layout=(LinearLayout)this.findViewById(R.id.layout);
- newThread(this).start();
- //pull解析xml
- publicList>pullParseXml(){
- List>lists=null;
- Studentstudent=null;
- try{
- XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
- //获取XmlPullParser实例
- XmlPullParserpullParser=factory.newPullParser();
- InputStreamin=this.getClass().getClassLoader().getResourceAsStream("student.xml");
- pullParser.setInput(in,"UTF-8");
- //开始
- inteventType=pullParser.getEventType();
- while(eventType!=XmlPullParser.END_DOCUMENT){
- StringnodeName=pullParser.getName();
- switch(eventType){
- //文档开始
- caseXmlPullParser.START_DOCUMENT:
- lists=newArrayList>();
- break;
- //开始节点
- caseXmlPullParser.START_TAG:
- if("student".equals(nodeName)){
- student=newStudent();
- student.setId(Integer.parseInt(pullParser.getAttributeValue(0)));
- student.setGroup(Integer.parseInt(pullParser.getAttributeValue(1)));
- }elseif("name".equals(nodeName)){
- student.setName(pullParser.nextText());
- }elseif("sex".equals(nodeName)){
- student.setSex(pullParser.nextText());
- }elseif("age".equals(nodeName)){
- student.setAge(Integer.parseInt(pullParser.nextText()));
- }elseif("email".equals(nodeName)){
- student.setEmail(pullParser.nextText());
- }elseif("birthday".equals(nodeName)){
- student.setBirthday(pullParser.nextText());
- }elseif("memo".equals(nodeName)){
- student.setMemo(pullParser.nextText());
- break;
- //结束节点
- caseXmlPullParser.END_TAG:
- lists.add(student);
- student=null;
- default:
- //手动的触发下一个事件
- eventType=pullParser.next();
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- returnlists;
- @Override
- publicvoidrun(){
- //TODOAuto-generatedmethodstub
- >lists=pullParseXml();
- Messagemsg=handler.obtainMessage();
- msg.obj=lists;
- handler.sendMessage(msg);
- }
注意xml中的<?xml version="1.0" encoding="utf-8"?> 这句话要顶格显示,不要留空隙,附则错了很难调试的。
解析后效果: (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|