Android 用 XStream 将复杂xml解析为javabean
来源:互联网 发布:金投顾软件 编辑:程序博客网 时间:2024/05/29 05:53
Android开发中,我们解析服务器给我们的数据一般就是JSON和XML 两种格式的内容。
JSON的解析我们可选的比较多 如Gson fastJson 等。我们之前说了 用GsonFormat来解析JSON并且自动生成相应的javabean, 一般来说,解析XML最快的方式,就是和服务器商量把数据传输方式换位JSON。。。但是有时候我们不可不免的遇到XML需要解析。如果少量的话,那么我们直接用JDK提供的pull方式去解析就可以了。
但是如果比较多,也比较复杂。那么我们还是选择第三方库来完成比较好。
XStream的jar包的下载。
下载jar包请点击这里
下载完成之后里面包含了 xstream.jar 和 xapp3.jar。
Xstream序列化XML时可以允许用户使用不同的XML解析器,用户可以使用一个标准的JAXP DOM解析器或自Java6集成StAX解析器。这样用户就不需要依赖xpp3.jar。
//XStream xstream = new XStream();//需要XPP3库 //XStream xstream = new XStream(new DomDriver());//不需要XPP3库 //XStream xstream = new XStream(new StaxDriver());//不需要XPP3库开始使用Java6
由于也有许多版本了,而我开始下载的是1.4.8版本的。导入之后总是报错。后来看网上说是1.4.8要java8支持,没考证,不过的确换成1.4.7就可以了,而且看版本使用统计 1.4.7也的确是使用人数最多的。
使用
我们拿到那个内容的xml字符串之后。可以同过下面几句代码将内容转为javaBean
XStream stream = new XStream(); stream.processAnnotations(TestBean.class);//这里需要注解是你自己根据xml写的bean类(下面附代码解释xml) TestBean result = (TestBean) stream.fromXML(xmlStr);
实例1
xml内容为:
<china dn="day"> <city prov= "西安"> <name>陕西</name> <age>18</age> <year>2016</year> </city> <city prov= "郑州"> <name>河南</name> <age>20</age> <year>2016</year> </city> <city prov= "石家庄"> <name>河北</name> <age>22</age> <year>2016</year> </city> <city prov= "三亚"> <name>海南</name> <age>88</age> <year>2016</year> </city></china>
首先这个xml串,是有一个List 集合,然后因为有dn=“day”的属性,相当于和List同级有一个 字段
然后每一个city 里面 有 prov 、name、age、year 等字段参数。
我们编写一个javabean :
@XStreamAlias("china")//类注解(必须写)public class ChinaBean { @XStreamAsAttribute() @XStreamAlias("dn") //属性注解 private String dn; @XStreamImplicit(itemFieldName = "city")//节点注解(必须写) private List<CityBean> city; //省略dn 和 city 的 getter 和 setter 方法 public static class CityBean { //值不用注解 private int year; private String name; private int age; @XStreamAsAttribute() @XStreamAlias("prov")//属性是必须用注解声明的 private String prov; //省略getter 和setter 方法 }}
如果xml的数据再复杂点
如:点我获取天气预报的xml内容
其实也没复杂多少,和上面的差不多,只不过多了好几个属性。
那么我们对照着写出这个天气预报的bean
@XStreamAlias("china")//这里用到注解(必须写)public class TestBean { @XStreamAsAttribute() @XStreamAlias("dn") private String dn; /** * tem2 : -20 * tem1 : -8 * quName : 黑龙江 * cityname : 哈尔滨 * pyName : heilongjiang * stateDetailed : 多云 * state2 : 1 * state1 : 1 * windState : 西北风3-4级转小于3级 */ @XStreamImplicit(itemFieldName = "city")//节点注解(必须写) private List<CityBean> city; //省略getter setter方法 public static class CityBean { @XStreamAsAttribute() @XStreamAlias("tem2") private int tem2; @XStreamAsAttribute() @XStreamAlias("tem1") private int tem1; @XStreamAsAttribute() @XStreamAlias("quName") private String quName; @XStreamAsAttribute() @XStreamAlias("cityname") private String cityname; @XStreamAsAttribute() @XStreamAlias("pyName") private String pyName; @XStreamAsAttribute() @XStreamAlias("stateDetailed") private String stateDetailed; @XStreamAsAttribute() @XStreamAlias("state2") private int state2; @XStreamAsAttribute() @XStreamAlias("state1") private int state1; @XStreamAsAttribute() @XStreamAlias("windState") private String windState; //省略getter setter方法 }}
我们看看丁香园论坛的rss数据
查看数据的请点击这里
上个数据截图:
我们分析一下这个数据:
- 最外层是 rss 里面有 好几个属性(需要注解),还有一个 channel的内容。
- channel里面 有好几个内容,并且有一个image的类和 一个数据的List(需要注解)
- image类里面有三个内容,
- List中的每条Itembean 中 有几个内容,并且有一条内容还有属性(注解)
- 由于有的标签是dc:date 这种格式。但是我们的变量不能这样命名,所以这种需要注解来增加别名。
我们一层一层去解析:
@XStreamAlias("rss") //别名注解public class DxyBean { @XStreamAsAttribute() @XStreamAlias("xmlns:dc") private String dc; @XStreamAsAttribute() @XStreamAlias("xmlns:rdf") private String rdf; @XStreamAsAttribute() @XStreamAlias("xmlns:taxo") private String taxo; @XStreamAsAttribute() @XStreamAlias("version") private String version; private ChannelBean channel; //省略getter setter方法 public static class ChannelBean { private String title; private String link; private String description; private String language; private String pubDate; @XStreamAlias("dc:date") private String dcdate; @XStreamAlias("dc:language") private String dclanguage; private ImageBean image; @XStreamImplicit(itemFieldName = "item")//节点注解(必须写) private List<ItemBean> item; //省略getter setter方法 public static class ImageBean { private String title; private String url; private String link; //省略getter setter方法 } public static class ItemBean { private String title; private String link; private String description; private String category; private String pubDate; private String guid; @XStreamAlias("dc:creator") private String dccreator; @XStreamAlias("dc:date") private String dcdate; @XStreamAsAttribute() private String domain; //省略getter setter方法 } }}
我们可以看到,对于属性的注解 1是必须写的,而如果我们的变量名 和标签里面的标签名相同,则相对于上图来说2那个注解是可以省略的。
我们从上面几个栗子看到,有属性和有值的xml的解析方式,那么其他的类型应该也都是大同小异了。
XStream的几种注解
Xstream注解常用知识:
@XStreamAlias("message") 别名注解 作用目标: 类,字段 @XStreamImplicit 隐式集合 @XStreamImplicit(itemFieldName="part") 作用目标: 集合字段 @XStreamConverter(SingleValueCalendarConverter.class) 注入转换器 作用目标: 对象 @XStreamAsAttribute 转换成属性 作用目标: 字段 @XStreamOmitField 忽略字段 作用目标: 字段 Auto-detect Annotations 自动侦查注解 xstream.autodetectAnnotations(true); 自动侦查注解与XStream.processAnnotations(Class[] cls)的区别在于性能.自动侦查注解将缓存所有类的类型.
参考了 XStream教程,点击查看教程
- Android 用 XStream 将复杂xml解析为javabean
- android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象
- 用XStream读取XML解析成javabean
- xStream 将xml转为javaBean
- XStream(JavaBean转换为xml)
- XStream解析复杂XML(一)
- android中解析复杂xml(XStream简单使用)
- android xstream 解析xml
- XStream 解析xml 转 javaBean 问题
- 使用XStream解析复杂的XML文件
- 使用XStream解析复杂的XML文件
- 使用XStream解析复杂的XML文件
- 使用XStream解析复杂的XML文件
- 用xstream解析XML
- 用Xstream解析XML
- XStream在将类转换为XML
- android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件
- java中解析复杂xml(XStream简单使用)
- Android状态栏微技巧,带你真正理解沉浸式模式
- 石墨文档的云端表格实时压缩策略
- python-初级
- 微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
- 在两个升序数组中找到第k小的数据
- Android 用 XStream 将复杂xml解析为javabean
- sleep, yield, wait的区别
- angularJs中filter的用法及api解释
- 每次maven-update project ,又变成compile level变为1.5解决方法
- 微信小程序开发之本地图片上传(leancloud)
- Spring boot集成Mybatis
- IDEA15 配置使用
- Leetcode 26 Remove Duplicates from Sorted Array
- SwissArmyKnife调试Android UI的工具