XML 处理利器 : XStream

XStream 概述

     XStream 是一套简洁易用的开发类库,用于将Java对象序列化为XML或者将XML反序列化为JAVA对象,是JAVA对象和XML之间一个双向转换器。

举例

    采用User用户对象和LoginLog登录日志对象作为XStream实例转换对象. 例子简单,直接贴代码了.
       User.java 
       
package com.baobaotao.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class User implements Serializable {
	private int userId;
	private String userName;
	private String password;
	private int credits;
	private String lastIp;
	private Date lastVisit;
	private List logs; 
	private Map datas;
	
	public List<LoginLog> getLogs() {
		return logs;
	}
	public void setLogs(List logs) {
		this.logs = logs;
	}
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public int getCredits() {
		return credits;
	}
	public void setCredits(int credits) {
		this.credits = credits;
	}
	public String getLastIp() {
		return lastIp;
	}
	public void setLastIp(String lastIp) {
		this.lastIp = lastIp;
	}
	public Date getLastVisit() {
		return lastVisit;
	}
	public void setLastVisit(Date lastVisit) {
		this.lastVisit = lastVisit;
	}
	
	public void addLoginLog(LoginLog log){
		if(this.logs==null){
			logs = new ArrayList<LoginLog>();
		}
		logs.add(log);
	}
	
	public Map getDatas() {
		return datas;
	
	}
	public void setDatas(Map datas) {
		this.datas = datas;
	}
	
}

LoginLog.java

package com.baobaotao.domain;

import java.io.Serializable;
import java.util.Date;

public class LoginLog implements Serializable {
	private int loginLogId;
	private int userId;
	private String ip;
	private Date loginDate;
	
	public int getLoginLogId() {
		return loginLogId;
	}
	public void setLoginLogId(int loginLogId) {
		this.loginLogId = loginLogId;
	}
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public Date getLoginDate() {
		return loginDate;
	}
	public void setLoginDate(Date loginDate) {
		this.loginDate = loginDate;
	}
	

}

下面就开始使用XStream进行对象与 XML之间的转换.
package com.baobaotao.oxm.xtream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Date;

import com.baobaotao.domain.LoginLog;
import com.baobaotao.domain.User;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class XStreamSample {
	
    private static XStream xstream;
    static{
    	//创建XStream实例并指定一个XML	解析器
    	xstream=new XStream(new DomDriver());
    }
    
    //初始化转换对象
    public static User getUser(){
    	LoginLog log1=new LoginLog();
    	log1.setIp("192.168.1.91");
    	log1.setLoginDate(new Date());
    	
    	User user=new User();
    	user.setUserId(1);
    	user.setUserName("xstream");
    	user.addLoginLog(log1);
    	
    	return user;
    }
    
    //Java  对象转换成XML
    public static void objectToXML() throws Exception{
    	
    	//获取转换User对象的实例
    	User user=getUser();
    	//实例化一个文件输出流
    	FileOutputStream fileOutputStream=new FileOutputStream("XStreamSample.xml");
    	
    	//将User对象转换为XML,并保存到指定文件
    	xstream.toXML(user,fileOutputStream);
    }
    
    
    //XML转换为Java对象
    public static User XMLToObject() throws Exception{
    	//实例化一个文件输入流
    	FileInputStream inputStream=new FileInputStream("XStreamSample.xml");
    	//将XML文件输入流转化为对象
    	User user=(User) xstream.fromXML(inputStream);
    	
    	for(LoginLog log :user.getLogs()){
    		if(log!=null){
    			System.out.println("访问IP:"+log.getIp());
    		}
    	}
    }

}

编写测试类
package com.baobaotao.oxm.xstream;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.io.BufferedReader;
import java.io.FileReader;

import org.junit.Test;

import com.baobaotao.domain.LoginLog;
import com.baobaotao.domain.User;
import com.baobaotao.oxm.xtream.XStreamSample;

public class TestXStreamSample {


	@Test
	public void objectToXml()throws Exception {
		XStreamSample.objectToXML();
		FileReader reader = new FileReader("XStreamSample.xml");
		BufferedReader br = new BufferedReader(reader);
		StringBuffer sb = new StringBuffer("");
		String s;
		while ((s = br.readLine()) != null) {
			sb.append(s);
		}
		System.out.println(sb.toString());
		reader.close();
		br.close();
//		assertXpathExists("//com.baobaotao.domain.User",sb.toString());
//		assertXpathExists("//credits",sb.toString());
//		assertXpathExists("//userName",sb.toString());
//		assertXpathExists("//com.baobaotao.domain.LoginLog",sb.toString());
	}

	@Test
	public void xmlToObject()throws Exception  {
		XStreamSample.objectToXML();
		User u = XStreamSample.XMLToObject();
		assertNotNull(u);
		assertEquals("xstream", u.getUserName());
		for (LoginLog log : u.getLogs()) {
			assertNotNull(log);
			assertNotNull(log.getIp());
			assertNotNull(log.getLoginDate());
		}

	}
}

生成的XML文件如下:
<com.baobaotao.domain.User>
  <userId>1</userId>
  <userName>xstream</userName>
  <credits>0</credits>
  <logs>
    <com.baobaotao.domain.LoginLog>
      <loginLogId>0</loginLogId>
      <userId>0</userId>
      <ip>192.168.1.91</ip>
      <loginDate>2015-03-25 07:44:05.783 UTC</loginDate>
    </com.baobaotao.domain.LoginLog>
  </logs>
</com.baobaotao.domain.User>


使用XStream 别名

        在默认情况下,Java对象映射到XML的映射,是Java对象属性名对应XML的元素名,Java类的全名对应XML根元素的名字。在实际的应用中,如果XML和Java类都已经存在相应的名字,在进行转换时,需要设置别名进行映射。
        XStream别名配置包含三种情况:
        类别名,用alias(String name ,Class type);
        类成员别名,用aliasField(String alias,Class definedIn,String fieldName);yo
        类成员作为属性别名,用aliasAttribute(Class definedIn,String attributeName,String alias)  ,单独命名没有意义,还要通过useAttributeFor(Class definedIn,String fieldName) 应用到某个类上。


    
package com.baobaotao.oxm.xtream.alias;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Date;

import com.baobaotao.domain.LoginLog;
import com.baobaotao.domain.User;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
 * 别名
 * @author yulei
 */
public class XStreamAliasSample {
    private static XStream xstream;
      static {
    		xstream=new XStream(new DomDriver());
    		//设置类别名,默认为当前类名称加上包名
    		xstream.alias("loginLog", LoginLog.class);
    		xstream.alias("user", User.class);
    		
    		//设置类成员别名
    		xstream.aliasField("id", User.class, "userId");
    		//把LoginLog的userId属性视为XML属性,默认为XML的元素
    		xstream.aliasAttribute(LoginLog.class, "userId","id");
    		xstream.useAttributeFor(LoginLog.class, "userId");
    		
    		//去掉集合类型生成XML的父节点,即忽略XML中的<logs></logs>标记
    		xstream.addImplicitCollection(User.class,"logs");
    		
      }
      
      
    //初始化转换对象
      public static User getUser(){
      	LoginLog log1=new LoginLog();
      	log1.setIp("192.168.1.91");
      	log1.setLoginDate(new Date());
      	
      	User user=new User();
      	user.setUserId(1);
      	user.setUserName("xstream");
      	user.addLoginLog(log1);
      	
      	return user;
      }
      
      //Java  对象转换成XML
      public static void objectToXML() throws Exception{
      	
      	//获取转换User对象的实例
      	User user=getUser();
      	//实例化一个文件输出流
      	FileOutputStream fileOutputStream=new FileOutputStream("XStreamSample.xml");
      	
      	//将User对象转换为XML,并保存到指定文件
      	xstream.toXML(user,fileOutputStream);
      }
      
      //XML转换为Java对象
      public static User XMLToObject() throws Exception{
      	//实例化一个文件输入流
      	FileInputStream inputStream=new FileInputStream("XStreamSample.xml");
      	//将XML文件输入流转化为对象
      	User user=(User) xstream.fromXML(inputStream);
      	
      	for(LoginLog log :user.getLogs()){
      		if(log!=null){
      			System.out.println("访问IP:"+log.getIp());
      		}
      	}
  		return user;
      }

}






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值