android之解析xml(XmlPullParser)

转载请注明出处 http://blog.****.net/luckty/article/details/72782725


之前的开发中都是使用sp存储数据获取,或者网络存储。偶然在技术讨论群里边有人在说怎么解析xml,所以就想要不写一个xml解析的工具类

那我就心想打算做一个解析的类

解析方式:XmlPullPaser

一、首先我们建一个XML

user.xnl

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user >
        <name>Mars</name>
        <age>26</age>
        <sex></sex>
    </user>
    <user >
        <name>Lynn</name>
        <age>24</age>
        <sex></sex>
    </user>
    <user >
        <name>Kervin</name>
        <age>未知</age>
        <sex>未知</sex>
    </user>
</users>

看一下结构

开头是<users></users> 对标签  名字其实无所谓,不过不要和下面的属性标签相同

中间就是<user></user>  以及user属性标签就不过多解释了,树形结构

二、创建解析类

在了解xml数据结构之后我们开始使用xmlpullparser去解析

创建一个类XmlPullPaserUtils

创建方法getObject();

为了能够通用,所以我使用了泛型去作为实体类Bean

方法参数说:

1、InputStream 输入流,用于读取xml文件

2、Class<T> clazz 实体类

3、tag 就是标签类的list

4、解析处理回调

public static <T extends Object> ArrayList<T> getObject(InputStream xml, Class<T> clazz, ArrayList<String> tag, XmlPullPaserCallBack xmlPullPaserCallBack) throws Exception {
    ArrayList<T> objList = null;
    T obj = null;
    XmlPullParser pullParser = Xml.newPullParser();
    pullParser.setInput(xml, "UTF-8"); //为Pull解释器设置要解析的XML数据
    int event = pullParser.getEventType();//判断xml标签类型
    while (event != XmlPullParser.END_DOCUMENT) {//循环判断
        switch (event) {
            case XmlPullParser.START_DOCUMENT://解析文档开始标志
                objList = new ArrayList<T>(); //初始化beanlist
                break;
            case XmlPullParser.START_TAG:
                if (tag.get(0).equals(pullParser.getName())) {//判断是不是taglist中的第一个bean标签
                    obj = clazz.newInstance();//初始化泛型
                    event = pullParser.next();//继续往下找tag
                }
                for (int i = 1; i < tag.size() - 1; i++) {
                    if (tag.get(i).equals(pullParser.getName())) {
                        xmlPullPaserCallBack.setParams(obj, tag.get(i), pullParser.nextText());//回调处理Bean类属性设置
                        event = pullParser.next();
//继续往下找tag
} } break; case XmlPullParser.END_TAG://end 标志
               //end of xml
                if (tag.get(tag.size() - 1).equals(pullParser.getName())) {
                    objList.add(obj);
                    obj = null;
                }
                break;

        }
        event = pullParser.next();
    }
    return objList;
}

//回调内部接口类

public interface XmlPullPaserCallBack {
    void setParams(Object obj, String paramsName, String value);
}

到这里工具类就写好了,现在来看一个例子

//x新建bean类

public class User {
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    private String name;
    private String age;

    public User(){

    }
    public User(String name, String age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    private String sex;


}

由于获取需要有四个参数 我们就先初始化这个参数

android之解析xml(XmlPullParser)


接口实现方法

android之解析xml(XmlPullParser)


android之解析xml(XmlPullParser)

android之解析xml(XmlPullParser)


运行看解析结果

android之解析xml(XmlPullParser)

android之解析xml(XmlPullParser)

扩张一下,如果你想使用file去实现也一样,这就涉及到IO了,这一知识点就不赘述,大家可以自己去尝试封装改版
如有问题请留言或者邮件到[email protected]