最近研究上了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 和 包裹对象的转换.下一篇博客再更新.