XStream解析和序列化xml

xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点、属性的描述。

隐式集合

当我们使用集合类时不想显示集合,只显示里面的元素即可.
使用隐式集合前:

<list> 
    <element /> 
    <element /> 
<list> 

使用隐式集合: xstream.addImplicitCollection(Person.class, "list");
使用隐式集合后:

<element /> 
<element />

下载jar包

可以在maven上面下载如下jar包:
xstream-1.3.1.jar
xpp3-1.1.3.3.jar

XStream常用注释

@XStreamAlias(“message”) 别名注解
作用目标: 类,字段
@XStreamImplicit 隐式集合 是指在集合中不显示集合的名称
@XStreamImplicit(itemFieldName=”part”)
作用目标: 集合字段
@XStreamConverter(SingleValueCalendarConverter.class) 注入转换器
作用目标: 对象
@XStreamAsAttribute 转换成属性
作用目标: 字段
@XStreamOmitField 忽略字段
作用目标: 字段

简单Demo

User类

package cn.xiaoyu.xstream.domain;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;

@XStreamAlias("user")  // 设置User类在xml中的别名
public class User {
    private Integer id;
    @XStreamAsAttribute()  // 将name设置为XML user元素的attribute
    private String name;
    private Date birth;
    @XStreamImplicit(itemFieldName="role")  // 将这个字段从xml中去掉
    private List<String> roles = new ArrayList<String>();
//    @XStreamImplicit(itemFieldName="address")  // 这儿和在Address.java上面添加@XStreamAlias("address")效果一样  
    private List<Address> addresses = new ArrayList<>();
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public List<String> getRoles() {
        return roles;
    }
    public void setRoles(List<String> roles) {
        this.roles = roles;
    }


    public List<Address> getAddresses() {
        return addresses;
    }
    public void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }
    public User(){}
    public User(int id, String name, Date birth) {
        super();
        this.id = id;
        this.name = name;
        this.birth = birth;
    }

}

Address类

package cn.xiaoyu.xstream.domain;

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("address") 
public class Address {
    private String addr;
    private int number;
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }

    public Address() {}
    public Address(String addr, int number) {
        super();
        this.addr = addr;
        this.number = number;
    }

}

Demo类

package cn.xiaoyu.xstream.demo;

import java.util.Date;

import com.thoughtworks.xstream.XStream;

import cn.xiaoyu.xstream.domain.Address;
import cn.xiaoyu.xstream.domain.User;

public class Demo {
    public static void main(String[] args) {
        // 初始化user对象
        User user = new User(1,"bubu",new Date());
        user.getRoles().add("coder");        
        user.getRoles().add("student");

        user.getAddresses().add(new Address("shenzhen",1234));
        user.getAddresses().add(new Address("anqing",5678));

        // 将对象转换成xml
        XStream xStream = new XStream();
//      这句和@XStreamAlias("user")等效
//        xStream.alias("user",User.class);
//        xStream.alias("address",Address.class);
        xStream.setMode(XStream.NO_REFERENCES);
//      这句和@XStreamImplicit()等效 
//      xStream.addImplicitCollection(User.class, "addresses"); 
//      这句和@XStreamAsAttribute()         
//      xStream.useAttributeFor(User.class,"name");
        //注册使用了注解的VO 
        xStream.processAnnotations(new Class[]{User.class,Address.class});
        String xml = xStream.toXML(user);
        System.out.println(xml);


        // 将xml转换为User对象
        XStream xs = new XStream();
//      这句和@XStreamAlias("user")等效
//        xs.alias("user",User.class);
//        xs.alias("address",Address.class);
        xs.setMode(XStream.NO_REFERENCES);
//      这句和@XStreamImplicit()等效 
//      xs.addImplicitCollection(User.class, "addresses"); 
//      这句和@XStreamAsAttribute()         
//      xs.useAttributeFor(User.class,"name");
        xs.processAnnotations(new Class[]{User.class,Address.class});
        User bubu = (User) xs.fromXML(xml);
        System.out.println(bubu.getAddresses().get(0).getNumber()+"---"+bubu.getName());
    }
}

注:

在生成xml时候出现:
Element roles of type java.lang.String is not defined as field in type cn.xiaoyu.xstream.domain.User
或者在解析xml的时候出现:
com.thoughtworks.xstream.mapper.CannotResolveClassException: user : user

两个异常在使用注释的时候可能是因为没有注册使用了注解的VO
在不使用注释的情况可能是因为某些别名,隐式集合没有设置正确,仔细检查一下。