XStream完美转化XML

1 篇文章 0 订阅
1 篇文章 0 订阅

XStream框架

XStream可以轻易的将java对象和xml文档相互转化,而且可以修改某个特定的属性和节点名称。

1、准备工作

1.1 下载jar包及官方资料

      XStream的jar下载地址:http://xstream.codehaus.org/download.html

      官方示例很全,官方参考资料:http://xstream.codehaus.org/tutorial.html

      添加jar文件到工程中,需要添加的jar包如下:

       

1.2 需要的javaBean

   

package com.lk.entity.xstream;

import java.util.List;

public class Student {
	private String sid;
	private String name;
	private List<Course> courses;

        // getter and setter
}
package com.lk.entity.xstream;

public class Course {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

1.3 测试用例代码

package com.lk.action.xstream;

import java.util.ArrayList;
import java.util.List;

import com.lk.entity.xstream.Course;
import com.lk.entity.xstream.Student;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;


/**
 * @project:demo
 * @package:com.lk.action.xstream
 * @ClassName:XStreamAction
 * @Description:java对象和xml字符串的相互转换
 * jar-lib-version:xstream-1.4.2; xmlpull-1.1.3.1
 * @author: lk
 * @date:2014-1-12 上午12:19:15
 * @version:1.0
 */
public class XStreamAction{
	
	/**
	 * @Description: java对象转化成xml
	 * @param 
	 * @return void
	 * @throws
	 */
	public void object2xml(){
		Student student = new Student();
		student.setSid("1");
		student.setName("lk");
		
		List<Course> courses=new ArrayList<Course>();
		
		Course course1=new Course();
		course1.setName("math");
		courses.add(course1);
		
		Course course2=new Course();
		course2.setName("English");
		courses.add(course2);
		
		student.setCourses(courses);
		
		
		// does not require XPP3 library
//		XStream xStream=new XStream(new DomDriver()); 
		
		// 类重命名
//              xStream.alias("student", Student.class);
//              xStream.alias("course", Course.class);
        
                // 属性重命名
//		xStream.aliasField("id", Student.class, "sid");
		
		// 使用隐式声明
//		xStream.addImplicitCollection(Student.class, "courses");
                // 将子节点指定为父节点的属性
//              xStream.useAttributeFor(Student.class, "name");
//              xStream.useAttributeFor(Course.class, "name");
                // 节点属性重命名
//              xStream.aliasAttribute(Student.class, "name", "sname");
//              xStream.aliasAttribute(Course.class, "name", "cname");
		
		String str=xStream.toXML(student);
		System.out.println(str);
	}
}

通过XStream对象的 toXML方法即可将java对象转化成xml.

1.4 预期结果

<student>
  <id>1</id>
  <name>lk</name>
  <course>
    <name>math</name>
  </course>
  <course>
    <name>English</name>
  </course>
</student>


2.、java对象转化XML

2.1  java对象转化成xml字符串

       使用Junit4测试上边的测试用例,我们发现执行的结果如下:

<com.lk.entity.xstream.Student>
  <sid>1</sid>
  <name>lk</name>
  <courses>
    <com.lk.entity.xstream.Course>
      <name>math</name>
    </com.lk.entity.xstream.Course>
    <com.lk.entity.xstream.Course>
      <name>English</name>
    </com.lk.entity.xstream.Course>
  </courses>
</com.lk.entity.xstream.Student>

      问题主要有3个:

  •  Student 和 Course使用了完整的路径名,而我们想使用自定义名称。
  •  Student的属性使用了原有属性sid,而我们想使用id.
  •  xml结构中多了<courses>标签

      OK,为了解决以上三个问题,我们可以使用如下方法:

  •  类重命名:void  alias(String name, Class type); 此方法可以为Class使用一个别名name,以代替完整的类名,与xml元素保持一致。
  • 属性重命名:void  aliasField(String alias, Class defineIn, String fieldName);此方法可以为指定的类 defineIn中的属性名fieldName指定一个别名 alias,以期与xml元素一致。
  • void  addImplicitCollection(Class ownerType, String fieldName);此方法可以为指定的类 ownerType中的属性fieldName添加一个隐性声明,这样就不会映射指定的xml tag.

        如1.3中的测试用例代码,我们把相应的注释去掉后,执行的结果就是经过重命名后的的结果,如1.4中的预期结果一样。

2.2  别名

       在2.1的例子中,我们了解了类别名和field别名的设置,接下来我们再了解一下 Attribute  alias的设置。

       在1.4的预期结果中,我们希望student 的子节点<name>作为父节点<student>的一个属性展现,即<student  name="##">,此时我们通过XStream对象的如下方法来设置:

       void  useAttributeFor(Class defineIn, String fieldName) 此方法表示将子节点<fieldName>作为父节点<defineIn>的一个属性显示。

       void  aliasAttribute(Class defineIn,String attributeName , String alias) 同时,我们可以用此方法为指定的节点<defineIn>的属性attributeName重命名为alias。

       在1.3的测试用例中,打开相应额注释部分,执行结果如下:

<student sname="lk">
  <id>1</id>
  <course cname="math"/>
  <course cname="English"/>
</student>


        我们还可以设置其它的别名,具体可参考官方文档 http://xstream.codehaus.org/javadoc/index.html









          













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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值