XStreamAlias 可以把objec和xml相互转换,但是有时候节点带有属性和值就需要特殊处理下:
<?xml version="1.0" encoding="UTF-8"?>
<student>
<studentList>
<student_Message sid="1">
<id>1</id>
<idType name="身份证">1</idType>
<idNo>1</idNo>
<name>张三</name>
<gender name="男">1</gender>
</student_Message>
<student_Message id="2">
<id>2</id>
<idType name="护照">2</idType>
<idNo>2</idNo>
<name>李华</name>
<gender name="女">2</gender>
</student_Message>
</studentList>
</student>
有时候需要生成或是解析上面这种XML。就需要用到XStream的其他属性
pom:需要使用到 xstream-1.4.8.jar
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.8</version>
</dependency>
创建实体类
import com.thoughtworks.xstream.annotations.XStreamAlias;
import java.util.List;
/**
* @author ceshi
* @Title: StudentList
* @ProjectName StudentList
* @Description: TODO
* @date 2018/7/1122:00
*/
//定义最外节点属性
@XStreamAlias("student")
public class StudentList {
//根据XML生成student集合
private List<Student> studentList;
public List<Student> getStudentList() {
return studentList;
} public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute; /**
* @author ceshi
* @Title: Student
* @ProjectName ceshi
* @Description: TODO
* @date 2018/7/1121:54
*/
//定义内部节点
@XStreamAlias("student_Message")
public class Student {
//定义<student_Message sid="1">属性
@XStreamAsAttribute()
private String sid;
private String id;
private IdType idType;
private String idNo;
private String name;
private Gender gender; public String getSid() {
return sid;
} public void setSid(String sid) {
this.sid = sid;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public IdType getIdType() {
return idType;
} public void setIdType(IdType idType) {
this.idType = idType;
} public String getIdNo() {
return idNo;
} public void setIdNo(String idNo) {
this.idNo = idNo;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Gender getGender() {
return gender;
} public void setGender(Gender gender) {
this.gender = gender;
}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter; /**
* @author ceshi
* @Title: IdType
* @ProjectName ceshi
* @Description: TODO
* @date 2018/7/1121:56
*/
@XStreamAlias("MaxBenefitDurPeriod")
@XStreamConverter(value = ToAttributedValueConverter.class, strings = { "value" })
public class IdType {
//// 将name作为Cat属性输出在父节点
@XStreamAsAttribute()
private String name;
private String value; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter; /**
* @author ceshi
* @Title: Gender
* @ProjectName ceshi
* @Description: TODO
* @date 2018/7/1121:58
*/
@XStreamAlias("MaxBenefitDurPeriod")
@XStreamConverter(value = ToAttributedValueConverter.class, strings = { "value" })
public class Gender {
@XStreamAsAttribute()
private String name;
private String value; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
}
}
工具类
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver; /**
* @author ceshi
* @Title: XStreamUtils
* @ProjectName ceshi
* @Description: TODO
* @date 2018/7/1122:10
*/
public class XStreamUtils{
/**
* 将Object转换为xml
* @param obj 转换的bean
* @return bean转换为xml
*/
public static String objectToXml(Object obj) {
XStream xStream = new XStream();
//xstream使用注解转换
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj);
} /**
* 将xml转换为T
* @param <T> 泛型
* @param xml 要转换为T的xml
* @param cls T对应的Class
* @return xml转换为T
*/
public static <T> T xmlToObject(String xml, Class<T> cls){
XStream xstream = new XStream(new DomDriver());
//xstream使用注解转换
xstream.processAnnotations(cls);
return (T) xstream.fromXML(xml);
}
}
测试类
import org.junit.Test;
import java.util.ArrayList;
import java.util.List; /**
* @author ceshi
* @Title: ceshi
* @ProjectName ceshi
* @Description: ceshiXStreamAlias
* @date 2018/7/1121:53
*/
public class JunitXStreamAlias {
@Test
public void test(){
StudentList studentList = new StudentList();
List<Student> list = new ArrayList<Student>();
Student s = new Student();
IdType i = new IdType();
Gender g = new Gender();
s.setSid("1");
s.setId("1");
i.setName("身份证");
i.setValue("1");
s.setIdType(i);
s.setIdNo("1");
s.setName("张三");
g.setName("男");
g.setValue("1");
s.setGender(g);
list.add(s);
Student s1 = new Student();
IdType i1 = new IdType();
Gender g1 = new Gender();
s1.setSid("2");
s1.setId("2");
i1.setName("护照");
i1.setValue("2");
s1.setIdType(i1);
s1.setIdNo("2");
s1.setName("李华");
g1.setName("女");
g1.setValue("2");
s1.setGender(g1);
list.add(s1);
studentList.setStudentList(list);
String xml = XStreamUtils.objectToXml(studentList);
xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+xml;
xml = xml.replaceAll("__","_");
System.out.println(xml);
StudentList ss = XStreamUtils.xmlToObject(xml,StudentList.class);
System.out.println(JSON.toJSON(ss));
} }
结果:
XStream使用总结:
XStreamAsAttribute 作用是将类内成员作为父节点属性输出,等同于xstream.useAttributeFor(Student.class, "sid")
XStreamAlias("cat") 等同于 xstream.alias("student_Message", Student.class);
XStreamConverter xstreamConvert用于指定class及Field的converter(转换方式)。
XStreamImplicit 注解使用当需要将collection或map类型的成员变量中数据转换成xml相同层次的元素时,可以在该成员变量使用该注解,会将添加注释的节点去掉 @XStreamImplicit(itemFieldName="studentList")