使用pull解析xml文件

在上一篇博客中介绍了使用xml序列化器保存数据,并且使用xml保存了模拟的10条短信,这篇博客介绍使用pull解析以xml方式保存在本地的那10条短信

和上一篇博客一样首先制作一个下图所示的界面,单击按钮后可以解析xml文件

使用pull解析xml文件_第1张图片


点击解析xml文件按钮后,会在控制台中看到解析后的数据

使用pull解析xml文件_第2张图片


实现方式,首先使用Android Studio创建一个Android工程,并且创建一个Message类用于处理短信数据

Message类中的代码如下

package com.fyt.resolvexml;

//创建一个Message类,用于处理短信数据
public class Message {

    //短信的内容
    private String body;

    //短信的发送日期
    private String date;

    //收信人的地址(收信人的手机号码)
    private String address;

    //短信的类型
    //0表示短信是发出去的
    //1表示短信是收到的
    private String type;

    //无参构造方法
    public Message() {

    }

    //构造方法
    public Message(String body, String date, String address, String type) {
        this.body = body;
        this.date = date;
        this.address = address;
        this.type = type;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getDate() {
        return date;
    }

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

    public String getAddress() {
        return address;
    }

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

    public String getType() {
        return type;
    }

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

    @Override
    public String toString() {
        return "Message{" +
                "body='" + body + '\'' +
                ", date='" + date + '\'' +
                ", address='" + address + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

然后修改MainActivity.java中的代码

package com.fyt.resolvexml;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;

import org.xmlpull.v1.XmlPullParser;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {

    //用于创建储存短信的集合
    private List<Message> messageList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
    }

    //解析xml文件
    public void resolveXml(View view) {

        //如果SD卡的状态为正常挂载状态
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

            //创建File对象
            //参数为用户名和密码的储存路径
            File file = new File("sdcard/sms.xml");

            //如果SD卡中存在sms.xml文件
            if (file.exists()) {

                //捕获文件操作中可能出现的异常
                try {

                    //获得SD卡下的sms.xml文件
                    FileInputStream fis = new FileInputStream(file);

                    //获得pull解析器对象
                    XmlPullParser xp = Xml.newPullParser();

                    //将文件以gbk编码的方式输入到xml中
                    xp.setInput(fis, "utf-8");

                    //获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作
                    int type = xp.getEventType();

                    //创建信息对象(用于处理短信数据)
                    Message message = null;

                    while(type != XmlPullParser.END_DOCUMENT)
                    {
                        //根据节点的类型,要做不同的操作
                        switch (type)
                        {
                            case XmlPullParser.START_TAG:
                                //获取当前节点的名字
                                if("message".equals(xp.getName()))
                                {
                                   //创建一个用于保存短信的集合
                                   messageList = new ArrayList<Message>();
                                }
                                else if("sms".equals(xp.getName()))
                                {
                                    //创建短信对象
                                    message = new Message();
                                }
                                else if("body".equals(xp.getName()))
                                {
                                    //获取当前节点的下一个节点的文本
                                    String body = xp.nextText();
                                    message.setBody(body);
                                }
                                else if("date".equals(xp.getName()))
                                {
                                    //获取当前节点的下一个节点的文本
                                    String date = xp.nextText();
                                    message.setDate(date);
                                }
                                else if("address".equals(xp.getName()))
                                {
                                    //获取当前节点的下一个节点的文本
                                    String address = xp.nextText();
                                    message.setAddress(address);
                                }
                                else if("type".equals(xp.getName()))
                                {
                                    String Type = xp.nextText();
                                    message.setType(Type);
                                }
                                break;

                            case XmlPullParser.END_TAG:
                                if("sms".equals(xp.getName()))
                                {
                                    //把city的javabean放入集合中
                                    messageList.add(message);
                                }
                                break;
                        }

                        //把指针移动到下一个节点,并返回该节点的事件类型
                        type = xp.next();
                    }

                    for (Message m : messageList)
                    {
                        System.out.println(m.toString());
                    }

                    //处理文件操作中产生的异常
                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        }
    }
}

最后在配置文件中添加两条权限

<!--对SD卡的写权限-->  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  
<!--对SD卡的读取权限-->  
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  

你可能感兴趣的:(使用pull解析xml文件)