XStream:Object与Xml字符串 互相转换 多个同名子节点以及节点属性的处理。

XStream是一个能将java 对象与 xml字符串进行互相转换的这么一个java library。

官网地址:http://xstream.codehaus.org/

最新版本为1.4.2,下载地址:https://nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/xstream-distribution/1.4.2/xstream-distribution-1.4.2-bin.zip


本篇文章的最终目的是将如下XML与JavaBean互相转换(由于代码太长,有些地方我会写伪代码或者注释),比较复杂:

Subscribe.java

XML                                 

对比上面的javabean与xml也能大致推断出,有一个Subscribe对应xml的根节点,而Subscribe类的属性则对应根节点下面的子节点。

但是需要注意的是,Params下面有2个同名子节点,并且这2个同名子节点都有属性,所以Params对应的应该为一个集合,集合中每一个元素为一个Param类的对象。

Param类又有2个属性,分别为Name和Value。

而XStream要实现对xml节点的属性与JavaBean之间进行转换,必须为该属性定义一个类,以及一个转换器,该转换器必须实现XStream中的某些接口,所以还需要5个类,分别为Param、Name、NameConverter、Value、ValueConverter:

Param.java

Name.java

NameConverter.java


Value.java


ValueConverter.java


Test.java

package com.xcy;

import java.util.ArrayList;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
 * @author Siuon
 * CSDN:http://blog.csdn.net/xiaochunyong
 *
 */
public class Test {
	
	public static String object2XML(){
		Subscribe subscribe = new Subscribe();
		subscribe.setAccountNumber(1);
		subscribe.setAppCode("GMHL");
		subscribe.setAppName("钢贸互联");
		subscribe.setAppVersionName("1.0");
		subscribe.setEndDate("2012/6/11 15:54:02");
		subscribe.setOrderAppCode("ORDAPP07e47e28201206111554022999039");
		subscribe.setOrderAppName("gmhl010的钢贸互联");
		subscribe.setRoleLevel("0");
		subscribe.setStartDate("2012/6/11 15:54:02");
		subscribe.setStatus(0);
		subscribe.setStrucCode("CMPf6ec6a81201206111553460629752");
		subscribe.setStrucName("gmhl010的公司");
		subscribe.setUserCode("gmhl010");
		subscribe.setUserId("1786");
		subscribe.setUserName("gmhl010");
		subscribe.setVersion("GMHL1.0");
		
		ArrayList<Param> params = new ArrayList<Param>();
		params.add(new Param(new Name("AuthStatus"), new Value("UnAuth")));
		params.add(new Param(new Name("IsTradeUser"), new Value("False")));
		subscribe.setParams(params);
		
		XStream xstream = new XStream(new DomDriver());
		//如果不调用alias方法,进行别名,XStream默认是将包名+类名作为节点名称,也就是<com.xcy.Subscribe>.....</com.xcy.Subscribe>
		xstream.alias("Subscribe", Subscribe.class);
		xstream.alias("Param", Param.class);
		//节点中的属性对应java,除了创建类、转换器外,还必须在这里进行注册,缺一不可
		xstream.useAttributeFor(Param.class, "Name");
		xstream.useAttributeFor(Param.class, "Value");
		xstream.registerConverter(new NameConverter());
		xstream.registerConverter(new ValueConverter());
		return xstream.toXML(subscribe);
	}
	
	
	public static Object xml2Object(String xml){
		XStream xstream = new XStream(new DomDriver());
		xstream.alias("Subscribe", Subscribe.class);
		xstream.alias("Param", Param.class);
		xstream.useAttributeFor(Param.class, "Name");
		xstream.useAttributeFor(Param.class, "Value");
		xstream.registerConverter(new NameConverter());
		xstream.registerConverter(new ValueConverter());
		return xstream.fromXML(xml);
	}
	
	public static void main(String[] args) {
		String xml = object2XML();
		System.out.println("xml:\r\n"+xml);
		
		Subscribe subscribe = (Subscribe)xml2Object(xml);
		System.out.println("\r\n\r\n\r\nobject property:");
		System.out.println(subscribe.getAppName());
		System.out.println(subscribe.getParams().get(0).getName().getAttributeValue());
		System.out.println(subscribe.getParams().get(0).getValue().getAttributeValue());
	}
}

运行结果:



由于比较复杂、不太好理解,所以笔者将源码打包上传了,不要积分。

有兴趣的可以去下载运行看看:XStream:Object与Xml字符串 互相转换


  

猜你喜欢

转载自blog.csdn.net/xiaochunyong/article/details/7654523