Xml字符串和Java对象转换利器——XStream

Maven配置:
<dependency>
	<groupId>com.thoughtworks.xstream</groupId>
	<artifactId>xstream</artifactId>
	<version>1.4.7</version>
</dependency>

实体类见博客《Json字符串和Java对象转换利器——Jackson》。所有的实体类除了包名不同,成员都一样。

工具类XStreamUtil:

package org.xstream;

import java.io.Writer;
import java.util.List;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;

public class XStreamUtil {
	
	/**
	 * Java对象转Xml字符串(序列化)
	 * @param object
	 * @return
	 */
	public String bean2Xml(Object object){
		XStream stream = new XStream(new XppDriver() {
			public HierarchicalStreamWriter createWriter(Writer out) {
				return new PrettyPrintWriter(out) {

					public void startNode(String name) {
						// 去掉包名
						if (name.indexOf(".") > -1) {
							name = name.substring(name.lastIndexOf(".") + 1);
						}
						super.startNode(name);
					};
				};
			}
		});
		return stream.toXML(object);
	}
	
	/**
	 * Xml字符串转Java对象(反序列化)
	 * @param xml
	 * @param rootName 根元素名称
	 * @param rootType 根元素对应的Java类型
	 * @param collectionTypes 集合类型
	 * @return
	 */
	public Object xml2Bean(String xml, String rootName, Class<?> rootType, 
			List<Class<?>> collectionTypes){
		XStream stream = new XStream();
		stream.alias(rootName, rootType);
		for (Class<?> clazz : collectionTypes) {
			stream.alias(clazz.getSimpleName(), clazz);
		}
		Object bean = stream.fromXML(xml);
		return bean;
	}
}
测试类XStreamUtilTest:
package org.xstream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.xstream.po.GetOrdersResponse;
import org.xstream.po.Order;
import org.xstream.po.PaginationResult;
import org.xstream.po.order.CheckoutStatus;

public class XStreamUtilTest {
	
	XStreamUtil streamUtil;
	GetOrdersResponse ordersResponse;
	static String xmlStr;
	
	@Before
	public void before() {
		streamUtil = new XStreamUtil();
		
		ordersResponse = new GetOrdersResponse();
		ordersResponse.setTimestamp("2007-12-10T16:12:55.184Z");
		ordersResponse.setAck("Success");
		ordersResponse.setBuild("e539_core_Bundled_5642307_R1");
		ordersResponse.setVersion("539");
		List<Order> orders = new ArrayList<Order>();
		for (int i = 0; i < 3; i++) {
			Order order = new Order();
			order.setOrderID("OrderId_" + i);
			order.setBuyerUserID("BuyerUserId_" + i);
			
			CheckoutStatus checkoutStatus = new CheckoutStatus();
			checkoutStatus.setEBayPaymentStatus("EBayPaymentStatus_" + i);
			checkoutStatus.setLastModifiedTime("LastModifiedTime_" + i);
			checkoutStatus.setStatus("Status_" + i);
			order.setCheckoutStatus(checkoutStatus);
			
			orders.add(order);
		}
		ordersResponse.setOrderArray(orders);
		PaginationResult paginationResult = new PaginationResult();
		paginationResult.setTotalNumberOfEntries("10");
		paginationResult.setTotalNumberOfPages("5");
		ordersResponse.setPaginationResult(paginationResult);
	}
	
	@Test
	public void bean2Xml(){
		xmlStr = streamUtil.bean2Xml(ordersResponse);
		System.out.println("--------序列化---------");
		System.out.println(xmlStr);
	}
	
	@Test
	public void xml2Bean(){
		System.out.println("----------反序列化---------");
		System.out.println(streamUtil.xml2Bean(xmlStr, 
				GetOrdersResponse.class.getSimpleName(), GetOrdersResponse.class, 
				Arrays.asList(new Class<?>[]{Order.class})));
	}
}
结果:
--------序列化---------
<GetOrdersResponse>
  <timestamp>2007-12-10T16:12:55.184Z</timestamp>
  <ack>Success</ack>
  <version>539</version>
  <build>e539_core_Bundled_5642307_R1</build>
  <paginationResult>
    <totalNumberOfEntries>10</totalNumberOfEntries>
    <totalNumberOfPages>5</totalNumberOfPages>
  </paginationResult>
  <orderArray>
    <Order>
      <orderID>OrderId_0</orderID>
      <checkoutStatus>
        <eBayPaymentStatus>EBayPaymentStatus_0</eBayPaymentStatus>
        <lastModifiedTime>LastModifiedTime_0</lastModifiedTime>
        <status>Status_0</status>
      </checkoutStatus>
      <buyerUserID>BuyerUserId_0</buyerUserID>
    </Order>
    <Order>
      <orderID>OrderId_1</orderID>
      <checkoutStatus>
        <eBayPaymentStatus>EBayPaymentStatus_1</eBayPaymentStatus>
        <lastModifiedTime>LastModifiedTime_1</lastModifiedTime>
        <status>Status_1</status>
      </checkoutStatus>
      <buyerUserID>BuyerUserId_1</buyerUserID>
    </Order>
    <Order>
      <orderID>OrderId_2</orderID>
      <checkoutStatus>
        <eBayPaymentStatus>EBayPaymentStatus_2</eBayPaymentStatus>
        <lastModifiedTime>LastModifiedTime_2</lastModifiedTime>
        <status>Status_2</status>
      </checkoutStatus>
      <buyerUserID>BuyerUserId_2</buyerUserID>
    </Order>
  </orderArray>
</GetOrdersResponse>
----------反序列化---------
GetOrdersResponse [ack=Success, build=e539_core_Bundled_5642307_R1, orderArray=[Order [buyerUserID=BuyerUserId_0, checkoutStatus=CheckoutStatus [eBayPaymentStatus=EBayPaymentStatus_0, lastModifiedTime=LastModifiedTime_0, status=Status_0], orderID=OrderId_0], Order [buyerUserID=BuyerUserId_1, checkoutStatus=CheckoutStatus [eBayPaymentStatus=EBayPaymentStatus_1, lastModifiedTime=LastModifiedTime_1, status=Status_1], orderID=OrderId_1], Order [buyerUserID=BuyerUserId_2, checkoutStatus=CheckoutStatus [eBayPaymentStatus=EBayPaymentStatus_2, lastModifiedTime=LastModifiedTime_2, status=Status_2], orderID=OrderId_2]], paginationResult=PaginationResult [totalNumberOfEntries=10, totalNumberOfPages=5], timestamp=2007-12-10T16:12:55.184Z, version=539]


需要注意的是,在反序列化时,如果XML元素冗余,则会抛出UnknownFieldException异常,此时可以设置忽略未知元素:

xstream.ignoreUnknownElements();


如果要将XML元素中的属性与Java对象的字段对应,该怎么办呢?例如有XML元素:

<Order id="123"/>
Java类:
class Order{
        private String orderID;
}
此时可以进行如下设置:
xstream.aliasAttribute(Order.class, "orderID", "id");






  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值