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

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

项目中使用了一个牛叉的方法解析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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值