首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

Android pull打包,直接解析xml

2012-09-24 
Android pull封装,直接解析xmlimport java.io.InputStreamimport java.lang.reflect.Fieldimport java.l

Android pull封装,直接解析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());        }    } }


热点排行