Android进阶_XML解析pull解析,使用反射

来源:互联网 发布:淘宝余姚司法拍卖网 编辑:程序博客网 时间:2024/06/15 21:01

明天==明年了,今天写一个工具方法,明年用

项目中使用了一个牛叉的方法解析xml,使用麻烦,速度又慢。为项目中独特解析方式写的工具方法就不拿出来了,大同小异,就是xml解析不一样,试用了getDeclaredFields获取bean中的字段
在解析json的时候好多的第三方可以一行代码解析数据,相当好用,解析xml使用第三方也是比较麻烦,写个工具类,来一句话解析xml

Java与Android之间反射有点区别:
*1、Android中java.beans包没了,通过使用PropertyDescriptor类来调用get/set方法没法用了
2、Field[] fields = cla.getDeclaredFields();在Java中是按照字段定义顺序,而在Android中获取到的字段数组是排序过后的,据前辈猜测是jvm的原因。*

xml中几个特殊字符对应的转义:
// < – <
// > – >
// & – &
// ” – "
// ’ – '

调用:
数据bean中都是String类型的,要有别的类型再getType处理,
只拿到节点文本,没有拿节点属性,项目中的xml没有属性

// 如果约定好了,第二个参数可以直接在方法中写死List<DbsxBean> datas2 = parseResultPull(result, "OBJ", DbsxBean.class);
    /**     * XML解析     *      * @author ztt     * @Title: parseResultPull       * @Description:      * @param @param result     返回值     * @param @param objTag     数据对象节点     * @param @param cla        数据bean     * @return List<T>          返回数据集合     * @date 2015-12-31     */    public <T> List<T> parseResultPull(String result,String objTag,Class<T> cla) {        List<T> datas = new ArrayList<T>();        XmlPullParserFactory xmlPullParserFactory = null;        XmlPullParser xmlPullParser = null;        int eventType = 0;        String nodeName = "";        try {            xmlPullParserFactory = XmlPullParserFactory.newInstance();            xmlPullParser = xmlPullParserFactory.newPullParser();            xmlPullParser.setInput(new StringReader(result));            eventType = xmlPullParser.getEventType();            while (eventType != XmlPullParser.END_DOCUMENT) {// 文档结束标记                if (eventType == XmlPullParser.START_TAG && objTag.equals(nodeName)) {                    T t = cla.newInstance();                // 反射创建一个对象                    eventType = xmlPullParser.next();       // 切换到下一个节点(开始节点,Text内容节点,结束节点)                    nodeName = xmlPullParser.getName();     // 获取节点名字,内容节点返回null                    while (!(eventType == XmlPullParser.END_TAG || objTag.equals(nodeName))) {                        if (eventType == XmlPullParser.START_TAG && !TextUtils.isEmpty(nodeName)) {                            Method meth = cla.getMethod("set" + firstUpcase(nodeName), String.class);                            meth.invoke(t, xmlPullParser.nextText());                        }                        eventType = xmlPullParser.next();                        nodeName = xmlPullParser.getName();                    }                    datas.add(t);                }                eventType = xmlPullParser.next();                nodeName = xmlPullParser.getName();            }        } catch (Exception e) {            throw new Error("xml PULL 解析出现错误");        }        return datas;    }    /**     * 将第一个字母转成大写     * @date 2015-12-31     */    public String firstUpcase(String data) {        return TextUtils.isEmpty(data) ? "" : data.substring(0,1).toUpperCase(Locale.getDefault())+data.substring(1);    }

数据bean:

package com.ztt.tax.bean;public class DbsxBean {    private String SFZH = null;    private String YHDM = null;    private String TXNR = null;    private String TXSJ = null;    private String BZ1 = null;    private String BZ2 = null;    private String BZ3 = null;    private String PATHXX = null;    private String RN = null;    public DbsxBean(String sFZH, String yHDM, String tXNR, String tXSJ,            String bZ1, String bZ2, String bZ3, String pATHXX, String rN) {        super();        SFZH = sFZH;        YHDM = yHDM;        TXNR = tXNR;        TXSJ = tXSJ;        BZ1 = bZ1;        BZ2 = bZ2;        BZ3 = bZ3;        PATHXX = pATHXX;        RN = rN;    }    public DbsxBean() {        super();    }    public String getSFZH() {        return SFZH;    }    public void setSFZH(String sFZH) {        SFZH = sFZH;    }    public String getYHDM() {        return YHDM;    }    public void setYHDM(String yHDM) {        YHDM = yHDM;    }    public String getTXNR() {        return TXNR;    }    public void setTXNR(String tXNR) {        TXNR = tXNR;    }    public String getTXSJ() {        return TXSJ;    }    public void setTXSJ(String tXSJ) {        TXSJ = tXSJ;    }    public String getBZ1() {        return BZ1;    }    public void setBZ1(String bZ1) {        BZ1 = bZ1;    }    public String getBZ2() {        return BZ2;    }    public void setBZ2(String bZ2) {        BZ2 = bZ2;    }    public String getBZ3() {        return BZ3;    }    public void setBZ3(String bZ3) {        BZ3 = bZ3;    }    public String getPATHXX() {        return PATHXX;    }    public void setPATHXX(String pATHXX) {        PATHXX = pATHXX;    }    public String getRN() {        return RN;    }    public void setRN(String rN) {        RN = rN;    }    @Override    public String toString() {        return "SFZH," + SFZH + ",YHDM" + YHDM + ",TXNR" + TXNR + ",TXSJ"                + TXSJ + ",BZ1" + BZ1 + ",BZ2" + BZ2 + ",BZ3" + BZ3 + ",PATHXX"                + PATHXX + ",RN" + RN;    }}

数据源格式:直接用的项目中的接口,地址不能给出,数据已修改

<?xml version="1.0" encoding="UTF-8"?><xml>    <code>100</code>    <totlecount>15</totlecount>    <OBJ>        <SFZH>98302342341</SFZH>        <YHDM>98asdf</YHDM>        <TXNR>个人工作任务已提交,请您及时审核!</TXNR>        <TXSJ>2015-12-30 09:42:34</TXSJ>        <BZ1></BZ1>        <BZ2></BZ2>        <BZ3></BZ3>        <PATHXX>/individual0afea459296fd6a1a2be53acf&amp;dbId=db9e865a508b4b86b7b6bd5d631d68ca</PATHXX>        <RN>1</RN>    </OBJ></xml>
0 0