XStream基础使用

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方法

抛砖引玉,有错误或高级应用的,望不吝赐教。

猜你喜欢

转载自elfasd.iteye.com/blog/1766081