通过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包的网站,-->
点击看