XStream-实现XML解析,生成与之对应的Java bean

Xstream常用注解: 
@XStreamAlias("message") :

  别名注解  

作用目标: 类,字段  

@XStreamImplicit

隐式集合 

@XStreamImplicit(itemFieldName="subElementName")  
作用目标:

集合字段  

@XStreamConverter(SingleValueCalendarConverter.class)

注入转换器  
作用目标: 对象  

@XStreamAsAttribute 转换成属性  
作用目标: 字段  

@XStreamOmitField 忽略字段  
作用目标: 字段  

隐式集合: 
当我们使用集合类时不想显示集合,只显示里面的元素即可. 
使用隐式集合前: 
<list> 
 <element /> 
 <element /> 
<list> 

使用隐式集合后: 
 <element /> 
 <element /> 

解析XML生成java bean代码示例:

xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<family>
	<phone>1234</phone>
	<address>shan'xi xi'an</address>
	<sports>football,basketball</sports>
	<members>
		<member role="father">
			<name>john</name>
			<age>42</age>
			<gender>man</gender>
		</member>
		<member role="mother">
			<name>lili</name>
			<age>40</age>
			<gender>women</gender>
		</member>
		<member role="son">
			<name>west</name>
			<age>5</age>
			<gender>man</gender>
		</member>
	</members>
</family>

 定义Family模型.

注:Family模型中sports属性为List<String>,即从xml读取的”football,basketball“要转化为List

所以自定义一个SportsConverter,并在sports属性上面增加注解

@XStreamConverter(SportsConverter.class)

/**
 * 
 */
package xStream;

import java.io.Serializable;
import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;

/**
 * @author Administrator
 * 
 */
@XStreamAlias("family")
public class Family implements Serializable
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 2666558275262597117L;
	
	@XStreamAlias("phone")
	private String telephone;
	
	private List<Person> members;
	
	private String address;
	
	@XStreamConverter(SportsConverter.class)
	private List<String> sports;
	
	public String getTelephone()
	{
		return telephone;
	}
	
	public void setTelephone(String telephone)
	{
		this.telephone = telephone;
	}
	
	public List<Person> getMembers()
	{
		return members;
	}
	
	public void setMembers(List<Person> members)
	{
		this.members = members;
	}
	
	public String getAddress()
	{
		return address;
	}
	
	public void setAddress(String address)
	{
		this.address = address;
	}
	
	public List<String> getSports()
	{
		return sports;
	}
	
	public void setSports(List<String> sports)
	{
		this.sports = sports;
	}
	
	@Override
	public String toString()
	{
		return "Family [address=" + address + ", members=" + members
				+ ", sports=" + sports + ", telephone=" + telephone + "]";
	}
	
}
package xStream;

import java.io.Serializable;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.extended.ToStringConverter;

@XStreamAlias("member")
public class Person implements Serializable
{
	/**
	 * 
	 */
	private static final long serialVersionUID = -7139978490881468546L;
	
	@XStreamAsAttribute
	private String role;
	
	private String name;
	
	private String gender;
	
	private String age;
	
	public String getRole()
	{
		return role;
	}
	
	public void setRole(String role)
	{
		this.role = role;
	}
	
	public String getName()
	{
		return name;
	}
	
	public void setName(String name)
	{
		this.name = name;
	}
	
	public String getGender()
	{
		return gender;
	}
	
	public void setGender(String gender)
	{
		this.gender = gender;
	}
	
	public String getAge()
	{
		return age;
	}
	
	public void setAge(String age)
	{
		this.age = age;
	}
	
	@Override
	public String toString()
	{
		return "Person [age=" + age + ", gender=" + gender + ", name=" + name
				+ ", role=" + role + "]";
	}
	
}

自定义一个SportsConverter.java实现将String转化为List<String>

/**
 * 
 */
package xStream;

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

import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

/**
 * @author Administrator
 * 
 */
public class SportsConverter implements Converter
{
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.thoughtworks.xstream.converters.Converter#marshal(java.lang.Object,
	 * com.thoughtworks.xstream.io.HierarchicalStreamWriter,
	 * com.thoughtworks.xstream.converters.MarshallingContext)
	 */
	@Override
	public void marshal(Object obj,
			HierarchicalStreamWriter hierarchicalstreamwriter,
			MarshallingContext marshallingcontext)
	{
		// TODO Auto-generated method stub
		
	}
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.thoughtworks.xstream.converters.Converter#unmarshal(com.thoughtworks
	 * .xstream.io.HierarchicalStreamReader,
	 * com.thoughtworks.xstream.converters.UnmarshallingContext)
	 */
	@Override
	public Object unmarshal(HierarchicalStreamReader reader,
			UnmarshallingContext unmarshallingcontext)
	{
		List<String> sportsList = new ArrayList<String>();
		try
		{
			String sportCollect = reader.getValue();
			String[] sports = sportCollect.split(",");
			if ((null != sports) && (0 != sports.length))
			{
				for (String string : sports)
				{
					sportsList.add(string);
				}
				
			}
			
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return sportsList;
	}
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.thoughtworks.xstream.converters.ConverterMatcher#canConvert(java.
	 * lang.Class)
	 */
	@Override
	public boolean canConvert(Class class1)
	{
		return class1.equals(ArrayList.class);
	}
}
/**
 * 
 */
package xStream;

import java.io.File;

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

/**
 * @author Administrator
 * 
 */
public class XStream2JaveBean
{
	
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		XStream xStream = new XStream(new Dom4JDriver());
		xStream.processAnnotations(Family.class);
		xStream.processAnnotations(Person.class);
		
		Family family = (Family) xStream.fromXML(new File("d:\\NewFile.xml"));
		System.out.println(family);
	}
}

 执行XStream2JaveBean的main函数。结果如下:

Family [address=shan'xi xi'an, members=[Person [age=42, gender=man, name=john, role=father], Person [age=40, gender=women, name=lili, role=mother], Person [age=5, gender=man, name=west, role=son]], sports=[football, basketball], telephone=1234]
 

 成功获取到XML对应的Family java模型。

猜你喜欢

转载自489291468.iteye.com/blog/1900342
今日推荐