XStream框架
XStream可以轻易的将java对象和xml文档相互转化,而且可以修改某个特定的属性和节点名称。
1、准备工作
1.1 下载jar包及官方资料
XStream的jar下载地址:http://xstream.codehaus.org/download.html
官方示例很全,官方参考资料:http://xstream.codehaus.org/tutorial.html
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个:
- 类重命名: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