XStream完美转化XML

前端之家收集整理的这篇文章主要介绍了XStream完美转化XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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,"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对象的如下方法来设置:

voiduseAttributeFor(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























猜你在找的XML相关文章