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。