Android pull封装,直接解析xml

来源:互联网 发布:刺客信条电影知乎 编辑:程序博客网 时间:2024/06/05 07:11

         好久没写过博文了,最近在做xml方面的解析,xml的解析一直都是比较繁琐的,所以对android的 pull进行了简单的封装,不用再为每个xml都创建解析类,但目前只实现了对xml的简单实现,主要通过反射来实现

        能解析的xml形式主要有如下几种,复杂的暂未支持

<?xml version="1.0" encoding="UTF-8"?><list>    <user id="1">        <userName>张三</userName>        <email>zhangsan@xxx.com</email>    </user>    <user>        <id>2</id>        <userName>李四</userName>        <email>lisi@xxx.com</email>    </user>    <user>        <id>3</id>        <userName>王五</userName>        <email>wangwu@xxx.com</email>    </user></list>

对应的java类如下:

public class User {    private int id;    private String userName;    private String email;         public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }          }

支持简单的对象解析

<?xml version="1.0" encoding="UTF-8"?><menu>    <id>1</id>    <code>1002</code>    <name>测试</name></menu>

或者

<?xml version="1.0" encoding="UTF-8"?><menu id="1" code="1002">    <name>测试</name></menu>

对应的java类如下:

public class Menu {    private int id;    private int code;    private String name;         public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }     }

支持对象中有list列表的解析

<?xml version="1.0" encoding="UTF-8"?><parent>    <total>33</total>    <list>        <user>            <id>1</id>            <userName>张三</userName>            <email>zhangsan@xxx.com</email>        </user>        <user id="2">            <userName>李四</userName>            <email>lisi@xxx.com</email>        </user>        <user id="3" userName="王五">            <email>wangwu@xxx.com</email>        </user>    </list></parent>

对应的java类如下:

import java.util.List; public class UserList {    private int total;    private List<User> user;    public int getTotal() {        return total;    }    public void setTotal(int total) {        this.total = total;    }    public List<User> getUser() {        return user;    }    public void setUser(List<User> user) {        this.user = user;    }}

xml解析器代码如下:

import java.io.InputStream;import java.lang.reflect.Field;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.ArrayList;import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.util.Log;import android.util.Xml; /** * 对pull解析xml进行了封装,不用给每个xml,再创建一个解析类 * * @author steven * * http://www.juziku.com/sunlightcs/ * */public class XmlParse {         /**     * 解析XML     * @param is        xml字节流     * @param clazz     字节码      如:Object.class     * @param startName       开始位置     * @return          返回List列表     */    @SuppressWarnings({ "rawtypes", "unchecked" })    public List getXmlList(InputStream is, Class<?> clazz, String startName) {        List list = null;        XmlPullParser parser = Xml.newPullParser();        Object object = null;        try {            parser.setInput(is, "UTF-8");            //事件类型            int eventType = parser.getEventType();             while (eventType != XmlPullParser.END_DOCUMENT) {                switch (eventType) {                    case XmlPullParser.START_DOCUMENT:                        list = new ArrayList<Object>();                        break;                    case XmlPullParser.START_TAG:                        //获得当前节点元素的名称                        String name = parser.getName();                        if (startName.equals(name)) {                            object = clazz.newInstance();                            //判断标签里是否有属性,如果有,则全部解析出来                            int count = parser.getAttributeCount();                            for(int i=0; i<count; i++)                                setXmlValue(object, parser.getAttributeName(i), parser.getAttributeValue(i));                        } else if (object != null) {                            setXmlValue(object, name, parser.nextText());                        }                        break;                    case XmlPullParser.END_TAG:                        if (startName.equals(parser.getName())) {                            list.add(object);                            object = null;                        }                        break;                }                eventType = parser.next();            }        } catch (Exception e) {            Log.e("xml pull error", e.toString());        }        return list;    }                   /**     * 解析XML     * @param is        xml字节流     * @param clazz     字节码      如:Object.class     * @return          返回Object     */    @SuppressWarnings({ "unchecked", "rawtypes" })    public Object getXmlObject(InputStream is, Class<?> clazz) {        XmlPullParser parser = Xml.newPullParser();        Object object = null;        List list = null;        Object subObject = null;        String subName = null;        try {            parser.setInput(is, "UTF-8");            //事件类型            int eventType = parser.getEventType();             while (eventType != XmlPullParser.END_DOCUMENT) {                switch (eventType) {                case XmlPullParser.START_DOCUMENT:                    object = clazz.newInstance();                    break;                case XmlPullParser.START_TAG:                    //获得当前节点元素的名称                    String name = parser.getName();                                         Field[] f = null;                    if(subObject == null){                        f = object.getClass().getDeclaredFields();                                                 //判断标签里是否有属性,如果有,则全部解析出来                        int count = parser.getAttributeCount();                        for(int j=0; j<count; j++)                            setXmlValue(object, parser.getAttributeName(j), parser.getAttributeValue(j));                    }else{                        f = subObject.getClass().getDeclaredFields();                    }                                         for(int i = 0; i < f.length; i++){                        if(f[i].getName().equalsIgnoreCase(name)){                            //判断是不是List类型                            if(f[i].getType().getName().equals("java.util.List")){                                Type type = f[i].getGenericType();                                if (type instanceof ParameterizedType) {                                    //获得泛型参数的实际类型                                    Class<?> subClazz = (Class<?>)((ParameterizedType)type).getActualTypeArguments()[0];                                    subObject = subClazz.newInstance();                                    subName = f[i].getName();                                                                         //判断标签里是否有属性,如果有,则全部解析出来                                    int count = parser.getAttributeCount();                                    for(int j=0; j<count; j++)                                        setXmlValue(subObject, parser.getAttributeName(j), parser.getAttributeValue(j));                                                                         if(list == null){                                        list = new ArrayList<Object>();                                        f[i].setAccessible(true);                                        f[i].set(object, list);                                    }                                }                            }else{   //普通属性                                if(subObject != null){                                    setXmlValue(subObject, name, parser.nextText());                                }else{                                    setXmlValue(object, name, parser.nextText());                                }                            }                            break;                        }                    }                    break;                case XmlPullParser.END_TAG:                    if (subObject != null && subName.equalsIgnoreCase(parser.getName())) {                        list.add(subObject);                        subObject = null;                        subName = null;                    }                    break;                }                eventType = parser.next();            }        } catch (Exception e) {            Log.e("xml pull error", e.getMessage());        }        return object;    }              /**     * 把xml标签的值,转换成对象里属性的值     * @param  t    对象     * @param name   xml标签名     * @param value  xml标签名对应的值     */    private void setXmlValue(Object t, String name, String value){        try {            Field[] f = t.getClass().getDeclaredFields();            for(int i = 0; i < f.length; i++){                if(f[i].getName().equalsIgnoreCase(name)){                    f[i].setAccessible(true);                    //获得属性类型                    Class<?> fieldType = f[i].getType();                                         if(fieldType == String.class) {                        f[i].set(t, value);                    }else if(fieldType == Integer.TYPE) {                        f[i].set(t, Integer.parseInt(value));                    }else if(fieldType == Float.TYPE) {                        f[i].set(t, Float.parseFloat(value));                    }else if(fieldType == Double.TYPE) {                        f[i].set(t, Double.parseDouble(value));                    }else if(fieldType == Long.TYPE) {                        f[i].set(t, Long.parseLong(value));                    }else if(fieldType == Short.TYPE) {                        f[i].set(t, Short.parseShort(value));                    }else if(fieldType == Boolean.TYPE) {                        f[i].set(t, Boolean.parseBoolean(value));                    }else{                        f[i].set(t, value);                    }                }            }        } catch (Exception e) {            Log.e("xml error", e.toString());        }    } }