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