使用SimpleXml解析xml数据<一>

最近研究上了Retrofit+Rxjava,对于http+json的服务器来说,这简直就是神器,不幸的是我公司使用的是Webservice+xml.在第一步我就遇到了困难.

不过要用也不是没有办法.首先第一步我们得先学习一下这个传说中SimpleXml.

想想很多年前我还是自己全手动解析xml的,真是太心酸了,后来又用了dom4j,jdom之类的xml解析工具.不过后来我发现了JAXB这个xml解析工具,真的是太好用了.嗯,感觉自己说了好多废话,不是来介绍simple-xml的吗,怎么扯了这么多有的没的.既然JAXB这么好用,那我为啥不用呢.

因为android对JAXB不支持,jar包一导入项目就无法成功编译了,查了很多资料,后来找到这个和JAXB功能类似,并且更轻量的xml解析工具,SimpleXml

首先我们需要在项目中添加依赖.

compile('com.squareup.retrofit2:converter-simplexml:2.1.0') {
        exclude group: 'stax', module: 'stax-api'
        exclude group: 'stax', module: 'stax'
        exclude group: 'xpp3', module: 'xpp3'
    }

准备一个要解析的xml字符串:

String xml = "<UserLoginResponse xmlns=\"http://android.goodjob.cn/\">\n" +
                "           <UserLoginResult>true</UserLoginResult>\n" +
                "       </UserLoginResponse>";

这里就举一个简单的例子.
然后建立一个需要的bean

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

/**
 * Created by fancy on 2016/6/21.
 */
@Root
public class LoginResult {
    @Element
    private String UserLoginResult;


    public LoginResult() {

    }


    public LoginResult(String userLoginResult) {
        UserLoginResult = userLoginResult;
    }

    public String getUserLoginResult() {
        return UserLoginResult;
    }

    public void setUserLoginResult(String userLoginResult) {
        UserLoginResult = userLoginResult;
    }

    @Override
    public String toString() {
        return "LoginResult{" +
                "UserLoginResult='" + UserLoginResult + '\'' +
                '}';
    }
}

建好了一个bean就可以开始转换了, 转换的程序非常简单.
但需要注意几点,首先bean文件和xml的属性必须完全对应.数量和名称,这意味着我们每获取一次服务器数据就要写一个对应的bean,这显然是不合理的,所以我们可以通过在bean中为属性设置 @Element(required = false)属性,这样,如果xml中没有这个属性,也不会报错,这就能大大帮助我们重复利用bean了.
其次就是当xml中只包含一个string属性的时候,我们不需要为一个String去写一个bean.基于以上,我写了自己的xml解析方法.

public static Object getXMLObject(String result, Class<?> clazz) {
        if (clazz.equals(String.class)) {
            int startResult = result.indexOf(">") + 1;
            int endResult = result.indexOf("</");
            return result.substring(startResult, endResult);
        }

        Object o = null;

        Strategy strategy = new AnnotationStrategy();
        Serializer serializer = new Persister(strategy);
        try {
            o = serializer.read(User.class, result);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return o;
    }

是不是非常简单.不过这还只是完成了对象的转换.

之后还有list 和 包裹对象的转换.下一篇博客再更新.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值