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...
}
<pre name="code" class="java">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。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值