android之解析xml(XmlPullParser)

来源:互联网 发布:阿里云费用中心是什么 编辑:程序博客网 时间:2024/06/03 16:05

转载请注明出处 http://blog.csdn.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;}

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


接口实现方法




运行看解析结果



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


原创粉丝点击