xml解析工具类

来源:互联网 发布:南泥湾种鸦片 知乎 编辑:程序博客网 时间:2024/05/17 18:46

参照:http://blog.csdn.net/nugongahou110/article/details/46963767点击打开链接


1:自定义javaBean:


public class TerminalInit_Bean extends Base_Bean{    private String updateStatus;     private String updateAddress;     private String msgExt;     private String downParam;     private String respCode;     private String respDesc;     public String getRespCode() {        return respCode;    }    public void setRespCode(String respCode) {        this.respCode = respCode;    }    public String getRespDesc() {        return respDesc;    }    public void setRespDesc(String respDesc) {        this.respDesc = respDesc;    }    public String getUpdateStatus() {        return updateStatus;    }    public void setUpdateStatus(String updateStatus) {        this.updateStatus = updateStatus;    }    public String getUpdateAddress() {        return updateAddress;    }    public void setUpdateAddress(String updateAddress) {        this.updateAddress = updateAddress;    }    public String getMsgExt() {        return msgExt;    }    public void setMsgExt(String msgExt) {        this.msgExt = msgExt;    }    public String getDownParam() {        return downParam;    }    public void setDownParam(String downParam) {        this.downParam = downParam;    }}

2:使用方法

Object obj = null;try {    obj = XmlUtils.getBeanListByParseXml(new ByteArrayInputStream(Info.netResult.getBytes()),            "upPay", cla);} catch (Exception e) {    Info.cuowu = "xml报文解析失败";    listener.onFail();}

3:工具类

public class XmlUtils {    /**     * 解析xml文件结构的方法, 返回一个对象     *     * @param inputStream 解析内容     * @param beanRoot    外层Bean需要实例化对象的一个标识     * @param beanClazz   Bean.class     * @return 返回  object 对象     * @throws Exception     */    public static <T, T1> Object getBeanListByParseXml(InputStream inputStream, String beanRoot, Class<T1> beanClazz)            throws Exception {        XmlPullParser parser = Xml.newPullParser();        //最后结果        Object result = null;        //list  存放一堆item        ArrayList<T> list = null;        //内层ListBean        T t = null;        //外层Bean        T1 bean = null;        //一个计数器        int count = 0;        Field mField = null; //List        Field mFieldList = null;        String listName = "";        try {            parser.setInput(inputStream, "UTF-8");            //获得当前标签类型            int eventType = parser.getEventType();            //如果不是xml文件结束标签,则一个一个向下解析            while (eventType != XmlPullParser.END_DOCUMENT) {                switch (eventType) {                    //如果是xml文件开始标签,则初始化一些数据                    case XmlPullParser.START_DOCUMENT:                        //最后的结果                        result = new Object();                        //list                        list = new ArrayList<T>();                        break;                    //开始标签                    case XmlPullParser.START_TAG:                        //获得标签的名字                        String tagName = parser.getName();                        //如果内层的ListBean已经实例化出来的话                        if (t != null) {                            try {                                Field field = t.getClass().getDeclaredField(tagName);                                if (!listName.equals(tagName)) {                                    //判断当前标签在没在ListBean的属性中                                    if (!tagName.equals(listName)) {                                        //如果ListBean中有当前标签                                        if (field != null) {                                            //计数器+1                                            count++;                                            //将取出来的值赋给ListBean中对应的属性                                            field.setAccessible(true);                                            field.set(t, parser.nextText());                                        }                                    }                                }                            } catch (Exception e) {                                //如果ListBean中没有当前标签,则会直接跳到这里,什么都不执行,然后再继续往下走                            }                            //如果外层的Bean已经实例化出来的话                        } else if (bean != null) {                            try {                                //判断当前标签在没在Bean的属性中                                Field field = beanClazz.getDeclaredField(tagName);                                if (field.getType().getSimpleName().equals("List")) {                                } else {                                    //如果Bean中有当前标签                                    if (field != null) {                                        //计数器+1                                        count++;                                        //将取出来的值赋给Bean中对应的属性                                        field.setAccessible(true);                                        field.set(bean, parser.nextText());                                    }                                }                            } catch (Exception e) {                                //如果Bean中没有当前标签,则会直接跳到这里,什么都不执行,然后再继续往下走                            }                        }                        try {                            //判断当前标签类型是否为List                            mField = beanClazz.getDeclaredField(tagName);                            mField.setAccessible(true);                            if (mField.getType().getSimpleName().equals("List")) { //判断标签是否为 一个 List 集合                                Utils.log("listName = " + listName);                                Utils.log("tagName = " + tagName);                                if (!tagName.equals(listName)) { //判断是否为相同集合                                    try {                                        //如果不是相同一个集合,设置List                                        mFieldList.set(bean, list);                                        //清空List                                        list.clear();                                    } catch (Exception e) {                                        //防止设置List 空指针异常                                    }                                }                                mFieldList = mField;                                listName = tagName;                                //实例化List集合中 对象类型                                Class cla = (Class) (((ParameterizedType) mField.getGenericType())                                        .getActualTypeArguments()[0]);                                t = (T) cla.newInstance();                            }                        } catch (Exception e) {                        }                        //如果当前标签为我们传入的内层根标签,说明Bean需要实例化出来了                        if (tagName.equals(beanRoot)) {                            //Bean实例化出来                            bean = beanClazz.newInstance();                        }                        break;                    //结束标签                    case XmlPullParser.END_TAG:                        //如果当前标签为</item>                        if (listName.equalsIgnoreCase(parser.getName())) {                            //如果ListBean不为空                            if (t != null) {                                //保存到list中,同时也保存到了result中,因为list已经是保存在result中了,                                //只不过刚才没有值,现在有值了                                list.add(t);                                //并且把ListBean置空,因为后续还有好多个item                                t = null;                            }                        } else if (beanRoot.equalsIgnoreCase(parser.getName())) { //最后结束标签                            try {                                //设置 list   防止空指针异常                                mFieldList.set(bean, list);                            } catch (Exception e) {                            }                            //Bean保存到result                            result = bean;                        }                        break;                }                //移动到下一个标签                eventType = parser.next();            }        } catch (Exception e) {            e.printStackTrace();        }        //如果计数器为0说明没有解析到任何数据        if (count == 0) {            //result置空就可以了            result = null;        }        //result返回        return result;    }}


0 0
原创粉丝点击