Android XStream 解析xml数据变成bean,支持CDATA
参考
1、Android 用 XStream 将复杂xml解析为javabean
2、XStream支持CDATA标签
3、Retrofit 用Soap协议访问WebService 详解
实例
留着上一篇retrofit访问webservice后,最后到访问成功,到需要解析CDATA数据为止,继续下面的工作,先看下数据格式吧:
* CDATA具体数据
<![CDATA[
<updatedata>
<table>
<name>table_xxx</name>
<field>id, codeid, name, pid, remark, inputdate, modifydate, status, type_num</field>
<values>
<value>302|302|亚硝酸盐|1|检测项目|2016-08-24 10:58:51.0|null|C|null</value>
...
<value>472|472|酱油氨基态氮|1|检测项目|2016-08-24 10:58:51.0|null|C|null</value>
</values>
</table>-200
<table>
<name>table_yyy</name>
<field>id, inputdate, modifydate, decision_basis, max_limit, min_limit, test_basis, unit, food_type, test_item</field>
<values>
....
</values>
</table>
</updatedata>
]]>
好吧。。。还需需要利器来解析,XStream来也(其他 SAX-xml,JSoup-html 应该也可以)
1、app 下的build.gradle,添加依赖
compile ('com.thoughtworks.xstream:xstream:1.4.7') {
exclude group: 'xmlpull', module: 'xmlpull'
}
2、xml的bean建立
2.1、@XStreamAlias 根节点
2.2、@XStreamImplicit 子节点
2.3、解释:(1)、子节点是值的话直接用 String xxSameAsElementName 来获取 (2)、子节点里面还有子节点的话用bean来获取,名字可取Element一样的,不一样要注解 (3)、子节点有N个相同的话用List<Bean>来获取,且需要注解子节点
1、第一层:updatedata是根节点,有子节点table且多个,用list<bean>
2、第二层:table下都只有一个个单独元素,是值的话直接用string xxSameAsElment来获取好了,有节点的话用bean
3、第三层:有N个相同数据,标注子节点,且用List<String>来获取
@XStreamAlias("updatedata")//类注解(必须写),根节点
public class ZydUpdateDataBean {
@XStreamImplicit(itemFieldName = "table")//节点注解(必须写),有N个用List
private List<ZydTableBean> tables;
public List<ZydTableBean> getTables() {
return tables;
}
public void setTables(List<ZydTableBean> tables) {
this.tables = tables;
}
//2 : 每个table下面可以看到有3个元素
public static class ZydTableBean{
String name;
String field;
ZydValues values;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public ZydValues getValues() {
return values;
}
public void setValues(ZydValues values) {
this.values = values;
}
//3
public static class ZydValues{
@XStreamImplicit(itemFieldName = "value")//节点注解(必须写)
private List<String> valueList;
public List<String> getValueList() {
return valueList;
}
public void setValueList(List<String> valueList) {
this.valueList = valueList;
}
}
}
}
3、支持CDATA的XStream工具编写~~直接Copy来
public class XStreamUtil {
public static String PREFIX_CDATA = "<![CDATA[";
public static String SUFFIX_CDATA = "]]>";
/**
* 全部转化
*/
public static XStream initXStream() {
return new XStream(new XppDriver() {
@Override
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
protected void writeText(QuickWriter writer, String text) {
// if (text.startsWith(PREFIX_CDATA) &&
// text.endsWith(SUFFIX_CDATA)) {
writer.write(PREFIX_CDATA + text + SUFFIX_CDATA);
// } else {
// super.writeText(writer, text);
// }
}
};
}
});
}
/**
* 初始化XStream可支持某一字段可以加入CDATA标签,如果需要某一字段使用原文,就需要在String类型的text的头加上
* "<![CDATA["和结尾处加上"]]>"标签, 以供XStream输出时进行识别
* @param isAddCDATA 是否支持CDATA标签
*/
public static XStream initXStream(boolean isAddCDATA) {
XStream xstream = null;
if (isAddCDATA) {
xstream = new XStream(new XppDriver() {
@Override
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
protected void writeText(QuickWriter writer, String text) {
if (text.startsWith(PREFIX_CDATA) && text.endsWith(SUFFIX_CDATA)) {
writer.write(text);
} else {
super.writeText(writer, text);
}
}
};
}
});
} else {
xstream = new XStream();
}
return xstream;
}
}
4、具体解析
//去掉乱七八糟数据
updateData = updateData.replace("</table>-200","</table>");
//XStream解析器:xml->bean
boolean flag = updateData.contains(XStreamUtil.PREFIX_CDATA);
XStream xStream = XStreamUtil.initXStream(flag);
xStream.processAnnotations(ZydUpdateDataBean.class);
ZydUpdateDataBean dataBean = (ZydUpdateDataBean) xStream.fromXML(updateData);

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
图像的色调、饱和度、亮度调节
对于图像的色调、亮度、饱和度Android提供了ColorMatrix来供我们进行修改 ●setRotate(int axis, float degrees) 设置色调 参数一(axis):颜色编号1(红),2(绿),3(蓝) 参数二(degrees):修改的值(这里为角度值0~360) 方法调用 ColorMatrix colorMatrixS=new ColorMatrix(); colorMatrixS.setRotate(0,one);//红 colorMatrixS.setRotate(1,one);//绿 colorMatrixS.setRotate(2,one);//蓝 ●setSaturation(float sat) 设置饱和度 参数(sat):值为1时是原图,大于1饱和度增加,小于1时饱和度减少,值为0时图像为灰色 方法调用 colorMatrixB.setSaturation(three); ●setScale(float rScale, float gScale, float bScale, float aScale)设置亮度 参数一(rScale):红色 参数...
-
下一篇
Android--进程常驻
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/78982951 网上大致有以下几种方法: 1、将Service设置为前台进程2、在service的onStartCommand方法里返回 STATR_STICK3、添加Manifest文件属性值为android:persistent=“true”4、覆写Service的onDestroy方法5、添加广播监听android.intent.action.USER_PRESENT事件以及其他一些可以允许的事件6、服务互相绑定7、设置闹钟,定时唤醒8、账户同步,定时唤醒 经测试,都能被轻松干掉,后来在github上找到大神写的,测试成功,分享一下: 这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取root权限下都无法杀死进程 支持系统2.3到6.0 支持大部分设备,包括三星,华为,oppo,nexus,魅族等等 可以简单对开机广播进行保护 git...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装