Xstream能干什么:
一、将XML文件解析为java对象
二、将java对象解析为XML文件
注:附件为使用XStream所依赖的jar包
1:首先可以看这么一个xml文件,目的就是要解析它到java对象:
<?xml version="1.0" encoding="GB2312"?> <cn.javasd.xstream.XstreamList> <testList> <cn.javasd.xstream.TestDto> <NAME>张路平</NAME> <USER>luping</USER> <PASSWORD>asd3839729</PASSWORD> </cn.javasd.xstream.TestDto> <cn.javasd.xstream.TestDto> <NAME>邢敏娜</NAME> <USER>minna</USER> <PASSWORD>3839729asd</PASSWORD> </cn.javasd.xstream.TestDto> </testList> <other>Just a String!</other> </cn.javasd.xstream.XstreamList>
2、定义转换后的java类
package cn.javasd.xstream;
import java.util.List;
public class XstreamList {
private List testList;
private String other;
//省略 getters and setters
}
通过比对XML文件的标签会发现这个类对应的是 <cn.javasd.xstream.XstreamList> 标签
testList属性对应<testList>标签
other属性对应<other>标签
看到这里想必也明白了Xstream的范式了,
这里我还定义了一个DTO,对应xml文件可以发现,它对应的就是 <cn.javasd.xstream.TestDto> 标签
这个标签在 <testList> 标签下,所以很容易理解就是 XstreamList 类中List中所填充的对象,这个DTO如下:
package cn.javasd.xstream;
public class TestDto {
private String NAME;
private String USER;
private String PASSWORD;
//省略getters and setters
}
3、解析XML文件到java对象
XML文件有了,对应的 java 对象也有了,怎么建立之间的关系呢
下面这个测试方法类就完成了解析,为了方便阅读,我将讲解都放到了类中的注释
这里面用到了Spring解析文件用的Resource类,提供了三种获取配置文件的方法,
当然Spring对这三种方法(其实还有)做了策略封装,这里为了方便,
就直接调用相应的类,不过,这不是这篇文章的重点,大家也可以用java的流去解析
package cn.javasd.xstream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class TestXStream {
@SuppressWarnings("unchecked")
public static void main(String args[]) throws IOException{
//以下三种获取方式均可以获取Resource资源
//1、按照classpath查找
@SuppressWarnings("unused")
Resource resource1 = new ClassPathResource("cfg/testXStream.xml");
//2、按照文件系统查找
@SuppressWarnings("unused")
Resource resource2 = new FileSystemResource("D:\\My Java Work6\\jms\\src\\cfg\\testXStream.xml");
//3、按照URL查找,如果要查找本地文件,前面可以加file 对应非本地的可以加 ftp 等
Resource resource3 = new UrlResource("file:/D:/My Java Work6/jms/src/cfg/testXStream.xml");
//提供的一些方法,可以自己试试
//获取文件的上次修改的时间
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(resource3.lastModified())));
//获取配置文件的输入流
InputStream is = resource3.getInputStream();
//new一个Xstream对象,有些时候也可以new XStream(); 但是我这里报错,需要指定解析驱动,就写成了下面这样
XStream stream = new XStream(new DomDriver());
//完成对象的转换,很简单,就是一个fromXML(InputStream is)方法
XstreamList xstreamList = (XstreamList)stream.fromXML(is);
//循环遍历打印展示结果
List<TestDto> list = xstreamList.getTestList();
for(TestDto dto:list){
System.out.println(xstreamList.getOther());
System.out.println(dto.getNAME() + " -- " + dto.getUSER() + " -- " + dto.getPASSWORD());
}
//第二项功能,将java对象序列化输出为 xml
//设置别名,为输出的xml进行简化,可以将下面一行注掉比对下输出结果
stream.alias("Xlist", XstreamList.class);
//调用 toXML(Object obj);方法完成转换
String s = stream.toXML(xstreamList);
System.out.println(s);
//不推荐这么写,开发中最好编写完整的 try catch块
is.close();
}
}
到此为止,XStream的两个基本用法就完成了,以上实例均在本地运行过,不过要添加相应的getter and setter方法
抛砖引玉,有错误或高级应用的,望不吝赐教。