Android 用 XStream 将复杂xml解析为javabean

本文介绍了Android开发中使用XStream库解析复杂XML数据的方法,包括XStream的jar包下载、基本使用和注解说明。通过实例展示了如何将XML转换为JavaBean,涉及属性、集合和自定义类的解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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数据

查看数据的请点击这里

上个数据截图:

这里写图片描述

我们分析一下这个数据:

  1. 最外层是 rss 里面有 好几个属性(需要注解),还有一个 channel的内容。
  2. channel里面 有好几个内容,并且有一个image的类和 一个数据的List(需要注解)
  3. image类里面有三个内容,
  4. List中的每条Itembean 中 有几个内容,并且有一条内容还有属性(注解)
  5. 由于有的标签是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教程,点击查看教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值