android pull解析xml

上一篇介绍了如何序列化一份xml文件,那接下来必不可少的肯定是解析它了,那现在我们就来解析一下上一篇生成的那份xml文件。如下:对了,方便起见,这份msmInfo.xml文件我把它放到src根目录下

这里写图片描述

序列化xml用的是XmlSerializer,那相应的解析就是用的XmlPullParser。具体要怎么做呢?

解析过程XmlParserService.java

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

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Xml;

import com.example.practice.domino.MsmInfo;

public class XmlParserService {

    public static List<MsmInfo> xmlMsmParser(InputStream inputStream)
            throws XmlPullParserException, IOException {
        List<MsmInfo> msmlist = null;
        MsmInfo msmInfo = null;

        XmlPullParser parser = Xml.newPullParser();// 新建一个Xml Pull Parser
        parser.setInput(inputStream, "utf-8");// 设置输入流解析器将开始。这个调用重置解析器的状态并设置初始值START_DOCUMENT事件类型
        int eventType = parser.getEventType();// 返回当前事件的类型(START_TAG、END_TAG、文本等)。
        while (eventType != XmlPullParser.END_DOCUMENT) {// 只要文档没结束,循环一直执行

            switch (eventType) {
            case XmlPullParser.START_TAG:// 当事件类型为START_TAG时,也就是解析到开始标签
                if ("msms".equals(parser.getName())) {
                    msmlist = new ArrayList<MsmInfo>();
                } else if ("msm".equals(parser.getName())) {
                    msmInfo = new MsmInfo();
                    int id = Integer.parseInt(parser.getAttributeValue(0));// 解析当前标签的属性
                    msmInfo.setId(id);
                } else if ("type".equals(parser.getName())) {
                    int type = Integer.parseInt(parser.nextText().trim());
                    msmInfo.setType(type);
                } else if ("date".equals(parser.getName())) {
                    long date = Long.parseLong(parser.nextText().trim());
                    msmInfo.setDate(date);
                } else if ("address".equals(parser.getName())) {
                    String address = parser.nextText().trim();
                    msmInfo.setAddress(address);
                } else if ("content".equals(parser.getName())) {
                    String content = parser.nextText().trim();
                    msmInfo.setContent(content);
                }
                break;

            case XmlPullParser.END_TAG:// 当事件类型为END_TAG时,也就是解析到结束标签
                if ("msm".equals(parser.getName())) {
                    msmlist.add(msmInfo);// 将对象添加到集合
                    msmInfo = null;// 重置短信对象
                }
                break;
            }

            eventType = parser.next();// 游标下移,继续解析下一个对象,切记:这个不可少
        }

        return msmlist;
    }
}

呐,我们肯定不会只解析就放那里不管了,当然要把解析到的内容显示出来嘛,代码如下:

                //得到msmInfo.xml文件的输入流
                InputStream inputStream = XmlParse_Aty.class.getClassLoader()
                        .getResourceAsStream("msmInfo.xml");
                try {
                    List<MsmInfo> msmList = XmlParserService
                            .xmlMsmParser(inputStream);

                    StringBuffer buffer = new StringBuffer();
                    for (MsmInfo msmInfo2 : msmList) {
                        buffer.append(msmInfo2.toString());
                        buffer.append("\n\n");
                    }
                    textView.setText(buffer.toString());
                } catch (XmlPullParserException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

MsmInfo.java

public class MsmInfo {

    private int id;
    private int type;// 1发送,0接收
    private long date;// 短信时间
    private String address;// 收件人or发件人
    private String content;// 短信内容

    public MsmInfo() {

    }

    public MsmInfo(int id, int type, long date, String address, String content) {
        this.id = id;
        this.type = type;
        this.date = date;
        this.address = address;
        this.content = content;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public long getDate() {
        return date;
    }

    public void setDate(long date) {
        this.date = date;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "[id=" + id + ", type=" + type + ", 时间=" + date + ", 电话=" + address + ", 短信内容=" + content + "]";
    }

}

到这里简单的代码思路就完成啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值