XStream实现xml和java对象之间的互相转换(包括对属性,别名,下划线_的处理),同理JSON也可以

首先去官网下载响应JAR包

http://xstream.codehaus.org/index.html

最少需要两个jar包,一个xstream.jar,一个是xmlpull.jar

首先来看下java对象到xml的转换

package xml;

class PhoneNumber {
	
	private int code;
	
	private int number;

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}
	
}

public class Person {

	private String username;
	
	private int age;
	
	private PhoneNumber pn;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public PhoneNumber getPn() {
		return pn;
	}

	public void setPn(PhoneNumber pn) {
		this.pn = pn;
	}
	
}

以上是一个普通的java对象
package xml;

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

public class XmlUtils {

	private static XStream xs = new XStream(new StaxDriver());
	
	public static String objToXml(Object obj) {
		//xs.aliasPackage(name,pkgName);
		return xs.toXML(obj);
	}
	
	public static void main(String[] args) {
		Person p = new Person();
		p.setAge(26);
		p.setUsername("chiwei");
		PhoneNumber pn = new PhoneNumber();
		pn.setCode(188);
		pn.setNumber(67101080);
		p.setPn(pn);
		xs.alias("person",Person.class);
		String xml = objToXml(p);
		Person per = (Person)xs.fromXML(xml);
		System.out.println(xml);
		System.out.println(per.getUsername());
	}
}

以上代码,先是生成一个对象,给各个属性赋值,然后调用toXML将对象转换为xml格式的普通文本,注意在转换前调用了alias目的是为了将xml.Person重命名为person

<?xml version="1.0" ?><person><username>chiwei</username><age>26</age><pn><code>188</code><number>67101080</number></pn></person>

这里xstream实例化时候传入了StaxDriver表示A driver using the StAX API to create XML reader and writer.

如果你使用xpp3driver,你需要引入该jar包

后面则根据上面转换后的xml继续转换成相应的对象Person

<?xml version="1.0" ?><person><username>chiwei</username><age>26</age><pn><code>188</code><number>67101080</number></pn></person>
chiwei


很简单


xs.alias("person",Person.class);
		xs.useAttributeFor(Person.class,"username");
		xs.aliasAttribute(Person.class,"username","name");
这种情况是将属性写到XML元素的里面作为属性,而不是单独作为一个子元素,如下所示:
<person name="chiwei">
<age>26</age>
</person>

-------------------------------------------------------------------------------华丽的分割线-------------------------------------------------------------------------------------------

以上的例子的确很简单,下面看看一些别的处理

xs.aliasField("res_type",SLIR.class,"resType");
该方法是用于将SLIR类中的resType属性在XML元素中显示为res_type,这里看到有一个下划线_,其实在xstream实例化的时候,如果没有用到XmlFriendlyNameCoder的话,可能下划线_就会变成__,因为在这里_其实是转移符,所以我们实例化xstream的时候应该如下:
private static XStream xs = new XStream(new DomDriver(null,new XmlFriendlyNameCoder("_-","_")));


xs.useAttributeFor(RequestMode.class,"type");
该方法的目的是将RequestMode类中的type属性作为该XML元素的内部属性

<requestmode type="PASSIVE"/>


最后再来看下,XML元素同时又属性和值得时候怎么处理

<msid enc="ASC" type="MSISDN">13505602768</msid>
如上所示,msid元素拥有两个属性,同时又拥有自己的值,这时候,在做转化的时候,必须自定义转换器converter才行
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;

public class ReqMsidConverter implements Converter {

	@SuppressWarnings("rawtypes")
	@Override
	public boolean canConvert(Class type) {
		// TODO Auto-generated method stub
		return type.equals(Msid.class);
	}

	@Override
	public void marshal(Object source,HierarchicalStreamWriter writer,MarshallingContext context) {
		// TODO Auto-generated method stub
		Msid msid = (Msid)source;
		writer.addAttribute("enc",msid.getEnc());
		writer.addAttribute("type",msid.getType());
		writer.setValue(msid.getMsid());
	}

	@Override
	public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context) {
		// TODO Auto-generated method stub\
		Msid msid = new Msid();
		msid.setEnc(reader.getAttribute("enc"));
		msid.setType(reader.getAttribute("type"));
		msid.setMsid(reader.getValue());
		return msid;
	}

}
定义完该转换器后,将其注册到xstream上即可
xs.registerConverter(new ReqMsidConverter());






版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇