1. 程式人生 > >XStream輕鬆轉換xml和java物件

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。