使用PULL解析XML文件

XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。

 下面来看一个pull解析xml的例子:
<?xml version="1.0" encoding="utf-8"?>    
    <root>    
        <student id="1" group="1">    
            <name>张三</name>    
            <sex></sex>    
            <age>18</age>    
            <email>zhangsan@163.com</email>    
            <birthday>1987-06-08</birthday>    
            <memo>好学生</memo>    
        </student>    
        <student id="2" group="2">    
            <name>李四</name>    
            <sex></sex>    
            <age>18</age>    
            <email>lisi@163.com</email>    
            <birthday>1987-06-08</birthday>    
            <memo>好学生</memo>    
        </student>    
        <student id="3" group="3">    
            <name>小王</name>    
            <sex></sex>    
            <age>18</age>    
            <email>xiaowang@163.com</email>    
            <birthday>1987-06-08</birthday>    
            <memo>好学生</memo>    
        </student>    
        <student id="4" group="4">    
            <name>小张</name>    
            <sex></sex>    
            <age>18</age>    
            <email>xiaozhang@163.com</email>    
            <birthday>1987-06-08</birthday>    
            <memo>好学生</memo>    
        </student>    
        <student id="5" group="5">    
            <name>小明</name>    
            <sex></sex>    
            <age>18</age>    
            <email>xiaoming@163.com</email>    
            <birthday>1987-06-08</birthday>    
            <memo>好学生</memo>    
        </student>    
    </root>    

对应的bean:

public class Student {    

    private int id;    
    private int group;    
    private String name;    
    private String sex;    
    private int age;    
    private String email;    
    private String memo;    
    private String birthday;    
    public int getId() {    
        return id;    
    }    
    public void setId(int id) {    
        this.id = id;    
    }    
    public int getGroup() {    
        return group;    
    }    
    public void setGroup(int group) {    
        this.group = group;    
    }    
    public String getName() {    
        return name;    
    }    
    public void setName(String name) {    
        this.name = name;    
    }    
    public String getSex() {    
        return sex;    
    }    
    public void setSex(String sex) {    
        this.sex = sex;    
    }    
    public int getAge() {    
        return age;    
    }    
    public void setAge(int age) {    
        this.age = age;    
    }    
    public String getEmail() {    
        return email;    
    }    
    public void setEmail(String email) {    
        this.email = email;    
    }    
    public String getMemo() {    
        return memo;    
    }    
    public void setMemo(String memo) {    
        this.memo = memo;    
    }    
    public String getBirthday() {    
        return birthday;    
    }    
    public void setBirthday(String birthday) {    
        this.birthday = birthday;    
    }    

}    

主要的解析和现实类:

import java.io.InputStream;  
import java.util.ArrayList;  
import java.util.List;  

import org.xmlpull.v1.XmlPullParser;  
import org.xmlpull.v1.XmlPullParserFactory;  

import android.app.Activity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.Message;  
import android.view.ViewGroup.LayoutParams;  
import android.widget.LinearLayout;  

import android.widget.TextView;  

public class PullActivity extends Activity implements Runnable{  

    private TextView pullTextView ;  
    private LinearLayout layout;  
    private Handler handler=new Handler(){  
         public void handleMessage(android.os.Message msg) {  
             List<Student> lists=(List<Student>) msg.obj;  
             for(int i=0;i<lists.size();i++){  
                 Student student=lists.get(i);  
                 StringBuffer sb=new StringBuffer();  
                 sb.append(student.getId()+"  ").append(student.getName()+"  ")  
                 .append(student.getAge()+"  ").append(student.getSex()+" ").append(student.getBirthday()+"  ")  
                 .append(student.getEmail()+"  ").append(student.getGroup()+"  ");  
                 TextView txt=new TextView(getApplicationContext());  
                 txt.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
                 txt.setText(sb.toString());  
                 layout.addView(txt);  
             }  
         };  
    };  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.pull);  

        pullTextView=(TextView) this.findViewById(R.id.pullTextView);  
        layout=(LinearLayout) this.findViewById(R.id.layout);  
        new Thread(this).start();  



    }  
    //pull解析xml  
    public List<Student> pullParseXml(){  
        List<Student> lists=null;  
        Student student=null;  

        try {  
            XmlPullParserFactory factory=XmlPullParserFactory.newInstance();  
            //获取XmlPullParser实例  
            XmlPullParser pullParser=factory.newPullParser();  
            InputStream in=this.getClass().getClassLoader().getResourceAsStream("student.xml");  
            pullParser.setInput(in, "UTF-8");  
            //开始  
            int eventType=pullParser.getEventType();  

            while(eventType!=XmlPullParser.END_DOCUMENT){  
                String nodeName=pullParser.getName();  
                switch (eventType) {  
                //文档开始  
                case XmlPullParser.START_DOCUMENT:  
                     lists=new ArrayList<Student>();  
                    break;  

                    //开始节点  
                case XmlPullParser.START_TAG:  
                    if("student".equals(nodeName)){  
                        student=new Student();  
                        student.setId(Integer.parseInt(pullParser.getAttributeValue(0)));  
                        student.setGroup(Integer.parseInt(pullParser.getAttributeValue(1)));  
                    }else if("name".equals(nodeName)){  
                        student.setName(pullParser.nextText());  
                    }else if("sex".equals(nodeName)){  
                        student.setSex(pullParser.nextText());  
                    }else if("age".equals(nodeName)){  
                        student.setAge(Integer.parseInt(pullParser.nextText()));  
                    }else if("email".equals(nodeName)){  
                        student.setEmail(pullParser.nextText());  
                    }else if("birthday".equals(nodeName)){  
                        student.setBirthday(pullParser.nextText());  
                    }else if("memo".equals(nodeName)){  
                        student.setMemo(pullParser.nextText());  
                    }  
                    break;  
                    //结束节点  
                case XmlPullParser.END_TAG:  
                    if("student".equals(nodeName)){  
                        lists.add(student);  
                        student=null;  
                    }  
                    break;  
                default:  
                    break;  
                }  
                 // 手动的触发下一个事件    
                eventType=pullParser.next();  
            }  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        return lists;  

    }  
    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        List<Student> lists=pullParseXml();  
        Message msg=handler.obtainMessage();  
        msg.obj=lists;  
        handler.sendMessage(msg);  
    }  
}  
  注意xml中的<?xml version="1.0" encoding="utf-8"?>  这句话要顶格显示,不要留空隙,附则错了很难调试的。

解析后效果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值