XStream轻松转换xml和java对象

时间:2023-03-09 09:31:16
XStream轻松转换xml和java对象

首先引入所需的jar:

xstream-1.4.9、xpp3_min-1.1.4c、dom4j-1.6.1,

或用maven管理jar包时在pom.xml中添加:

<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/xpp3/xpp3_min -->
<dependency>
<groupId>xpp3</groupId>
<artifactId>xpp3_min</artifactId>
<version>1.1.4c</version>
</dependency>
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>

实体类如下:

package com.cn.entity;

public class Address {

    //国
private String country;
//省
private String province;
//市
private String city;
//县
private String county;
//镇
private String town; get...
set...
}
package com.cn.entity;

import java.util.List;

public class Person {

    //姓名
private String name;
//性别
private String sex;
//年龄
private int age;
//地址
private List<Address> Address; get...
set...
}

XStream工具类:

package com.cn.util;

import com.cn.entity.Address;
import com.cn.entity.Person;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* XStream工具类
* @author sun.kai
* 2016年8月13日
*/
public class XStreamUtil { private static XStream xStream; //JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
static{
xStream = new XStream(new DomDriver());
/*
* 使用xStream.alias(String name, Class Type)为任何一个自定义类创建到类到元素的别名
* 如果不使用别名,则生成的标签名为类全名
*/
xStream.alias("person", Person.class);
xStream.alias("address", Address.class);
//将某一个类的属性,作为xml头信息的属性,而不是子节点
xStream.useAttributeFor(Address.class, "country");
//对属性取别名
xStream.aliasField("省", Address.class,"province");
} //xml转java对象
public static Object xmlToBean(String xml){
return xStream.fromXML(xml);
} //java对象转xml
public static String beanToXml(Object obj){
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xStream.toXML(obj);
}
}

测试用例:

package com.test.test;

import java.util.ArrayList;
import java.util.List; import com.cn.entity.Address;
import com.cn.entity.Person;
import com.cn.util.XStreamUtil; public class TestXStream { public static void main(String[] args) {
long time1 = System.currentTimeMillis();
//测试java对象转xml,java对象中包含集合对象
Person person = new Person();
person.setName("admin管理员");
person.setSex("男");
person.setAge(25);
List<Address> adds = new ArrayList<Address>();
Address address1 = new Address();
address1.setCountry("中国");
address1.setProvince("安徽");
address1.setCity("宿州");
address1.setCounty("萧县");
Address address2 = new Address();
address2.setCountry("中国");
address2.setProvince("上海");
address2.setCity(null);
address2.setCounty("");
adds.add(address1);
adds.add(address2);
person.setAddress(adds);
String xml = XStreamUtil.beanToXml(person);
System.out.println(xml); //测试xml转java对象
Person person2 = (Person) XStreamUtil.xmlToBean(xml);
System.out.println(person2.getAddress().get(1).getProvince()); long time2 = System.currentTimeMillis();
System.out.println((time2-time1)+"ms");
}
}

执行后控制台打印:

<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>admin管理员</name>
<sex>男</sex>
<age>25</age>
<Address>
<address country="中国">
<省>安徽</省>
<city>宿州</city>
<county>萧县</county>
</address>
<address country="中国">
<省>上海</省>
<county></county>
</address>
</Address>
</person>
上海
669ms

总结:

(1) XStream是一个可以将javaBean与XML双向转换的java类库。

(2) Java到xml,使用toXML()方法;xml到Java,用fromXML()方法。

(3) 类别名,用alias(String name, Class type)。

(4) 类成员别名,用aliasField(String alias, Class definedIn, String fieldName)。

(5) 将某一个类的属性,作为xml头信息的属性,而不是子节点,用useAttributeFor(Class definedIn, String fieldName)。

(5) 类成员作为属性别名,用 aliasAttribute(Class definedIn, String attributeName, String alias),单独命名没有意义,还要通过useAttributeFor(Class definedIn, String fieldName) 应用到某个类上。

(6) XStream默认当String类型的属性值为null时不封装到xml中。可以根据实际传xml情况,选择对象属性set空字符串还是null。