采用xstream实现javabean和xml互转(1)

通过xstream我们可以很轻松的实现javabean和xml互转,xstream官网提供的“两分钟教程”地址: http://xstream.codehaus.org/tutorial.html,教程是英文的,所以还是看我的吧……

互转首先要做的一般都是XStream实例化,方式有以下两类:
第一类:XStream xstream=new XStream();
第二类:XStream xstream=new XStream(new DomDriver());或XStream xstream=new XStream(new StaxDriver());

首先采用第二类方式……(这时 需要引入官网下载xstream-distribution-1.4.3-bin.zip压缩包中的xstream-1.4.3.jar包)
public static void main(String[] args) {
		//实例化xstream
		//XStream xstream=new XStream(new StaxDriver());
		XStream xstream=new XStream(new DomDriver());
		//javabean --> xml
		PhoneNumber pn=new PhoneNumber("yidong","111");
		User user=new User(1,"whmwg1",pn);
		String xmlStr=xstream.toXML(user);
		System.out.println(xmlStr.toString());
		System.out.println("******************************");
		//xml --> javabean
		String fromXml="<user><Id>1</Id><name>whmwg2</name><pn><type>liantong</type><number>122</number></pn></user>";
		xstream.processAnnotations(User.class);
		//xstream.autodetectAnnotations(true);
		User user2=(User)xstream.fromXML(fromXml);
		System.out.println(user2.getName());
		System.out.println(user2.getPn().getNumber());	
	}

此处需要说明一下的是,xml-->javabean的xml节点不完全与User类匹配时可以采用注解:
@XStreamAlias(value = "user")
public class User {
	@XStreamAlias(value = "Id")
	private Integer id;
	private String name;
	private PhoneNumber pn;
	public Integer getId() {
		return id;
	}

所以xstream.processAnnotations(User.class);的作用在我看来,应该是提醒xstream采用注解进行映射。
最后输出结果如下:
<User>
  <id>1</id>
  <name>whmwg1</name>
  <pn>
    <type>yidong</type>
    <number>111</number>
  </pn>
</User>
******************************
whmwg2
122


当你将如上第二类方式换成第一类方式,则会报错如下:
Exception in thread "main" java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserException
	at com.thoughtworks.xstream.XStream.<init>(XStream.java:336)
	at Test.main(Test.java:16)
Caused by: java.lang.ClassNotFoundException: org.xmlpull.v1.XmlPullParserException
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	... 2 more

提示找不到某某类,其实就是少包了嘛,根据“两分钟教程”只要将xpp3_min-1.1.4c.jar包和xmlpull-1.1.3.1.jar包引入即可

可是我比较多动,看着xpp3_min-1.1.4c.jar这个包名有点不爽,于是我将xmlpull-1.1.3.1.jar包去掉,运行之后javabean-->xml没问题,xml-->javabean就报错:
<User>
  <id>1</id>
  <name>whmwg1</name>
  <pn>
    <type>yidong</type>
    <number>111</number>
  </pn>
</User>
******************************
Exception in thread "main" java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory
	at com.thoughtworks.xstream.io.xml.XppDriver.createParser(XppDriver.java:57)
	at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:54)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:913)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:904)
	at Test.main(Test.java:27)
Caused by: java.lang.ClassNotFoundException: org.xmlpull.v1.XmlPullParserFactory
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	... 5 more

后来我越看xpp3_min-1.1.4c.jar这个包名越不爽,我在想它是不是一个阉割(min)的包?于是我另外找了一个xpp3-1.1.4c.jar包(这个包xstream官网压缩包中没有),引入之后竟然运行通过

所以,总之,实例化XStream若你采用第二种方式,只需要引入xstream-1.4.3.jar包;若你采用第一种方式,需要引入xstream-1.4.3.jar包和xpp3-1.1.4c.jar包。

附件带上xpp3-1.1.4c.jar包,最后推荐一个专门找jar包的网站,--> 点击看


你可能感兴趣的:(xml,javabean,xstream,互转)