XStream对象相当Java对象和XML之间的转换器,转换过程是双向的。创建XSteam对象的方式很简单,只需要newXStream()即可。
Java到xml,用toXML()方法。
Xml到Java,用fromXML()方法。
在没有任何默认配置的情况下,java到xml的映射,是java成员名对应xml的元素名,java类的全名对应xml根元素的名字。而实际中,往往是xml和java类都有了,要完成相互转换,必须进行别名映射。
别名配置包含三种情况:
1、类别名,用alias(Stringname,Classtype)。
2、类成员别名,用aliasField(Stringalias,ClassdefinedIn,StringfieldName)
3、类成员作为属性别名,用aliasAttribute(ClassdefinedIn,StringattributeName,Stringalias),单独命名没有意义,还要通过useAttributeFor(ClassdefinedIn,StringfieldName)应用到某个类上。
XStreamAnnotation
@XStreamAlias("AliasName"):usedtoaliasClassnameandfield
@XStreamAsAttribute():addattributeforClass
@XStreamImplicit()或者@XStreamImplicit(itemFieldName="Group")重新指定名字
XML解析器
1.XPP3(需要xpp3-[version].jar)
XStreamxstream=newXStream(newXppDriver());
2.JAXPDOM
XStreamxstream=newXStream(newDomDriver());不指定编码解析器XStreamxstream=newXStream(newDomDriver(“UTF-8”));指定编码解析器
XStreamd的一些小bug
--在定义别名中的下划线“_”转换为xml后会变成“__”这个符号.因此,尽量避免在别名中实用任何符号,却是需要下划线的时候,可以考虑实用连接符“-”,这个没有问题。
--JavaBean中常常有一些常量,在转换过程,XStream也会将这些常量转换过去,形成常量的xml节点,这显然不是想要的结果,对于常量字段,就不做转换了。
PersonBean.java:
/**
*@author: chenyoulong
*@Title:PersonBean.java
*@date 2012-9-28 下午3:10:47
*@Description:TODO
*/
package com.entity;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
/**
<person>
<firstName>chen</firstName>
<lastName>youlong</lastName>
<telphone>
<code>137280</code>
<number>137280968</number>
</telphone>
<faxphone>
<code>20</code>
<number>020221327</number>
</faxphone>
<friends>
<name>A1</name>
<name>A2</name>
<name>A3</name>
</friends>
<pets>
<pet>
<name>doly</name>
<age>2</age>
</pet>
<pet>
<name>Ketty</name>
<age>2</age>
</pet>
</pets>
</person>
**/
/**
* @ClassName:PersonBean
* @author: chenyoulong Email: chen.youlong@payeco.com
* @date :2012-9-28 下午3:10:47
* @Description:TODO
*/
@XStreamAlias("person")
public class PersonBean {
@XStreamAlias("firstName")
private String firstName;
@XStreamAlias("lastName")
private String lastName;
@XStreamAlias("telphone")
private PhoneNumber tel;
@XStreamAlias("faxphone")
private PhoneNumber fax;
// 测试一个标签下有多个同名标签
@XStreamAlias("friends")
private Friends friend;
// 测试一个标签下循环对象
@XStreamAlias("pets")
private Pets pet;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public PhoneNumber getTel() {
return tel;
}
public void setTel(PhoneNumber tel) {
this.tel = tel;
}
public PhoneNumber getFax() {
return fax;
}
public void setFax(PhoneNumber fax) {
this.fax = fax;
}
public Friends getFriend() {
return friend;
}
public void setFriend(Friends friend) {
this.friend = friend;
}
public Pets getPet() {
return pet;
}
public void setPet(Pets pet) {
this.pet = pet;
}
@XStreamAlias("phoneNumber")
public static class PhoneNumber {
@XStreamAlias("code")
private int code;
@XStreamAlias("number")
private String number;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
/**
* 用Xstream注解的方式实现:一个标签下有多个同名标签
*
* @ClassName:Friends
* @author: chenyoulong Email: chen.youlong@payeco.com
* @date :2012-9-28 下午4:32:24
* @Description:TODO 5个name 中国,美国,俄罗斯,英国,法国
*
* /article/details/5426765
*/
public static class Friends {
@XStreamImplicit(itemFieldName = "name")
// itemFieldName定义重复字段的名称,
/*
* <friends> <friends> <name>A1</name> <String>A1</String>
* <name>A2</name> 如果没有,则会变成 =====> <String>A1</String> <name>A3</name>
* <String>A1</String> </friends> </friends>
*/
private List<String> name;
public List<String> getName() {
return name;
}
public void setName(List<String> name) {
this.name = name;
}
}
// 测试同一标签下循环某一对象
public static class Animal {
@XStreamAlias("name")
private String name;
@XStreamAlias("age")
private int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
* 测试同一标签下循环某一对象
*
* @ClassName:Pets
* @author: chenyoulong Email: chen.youlong@payeco.com
* @date :2012-9-28 下午6:26:01
* @Description:TODO
*/
public static class Pets {
@XStreamImplicit(itemFieldName = "pet")
private List<Animal> animalList;
public List<Animal> getAnimalList() {
return animalList;
}
public void setAnimalList(List<Animal> animalList) {
this.animalList = animalList;
}
}
}
PersonTest.java:
public class PersonTest {
/**
* @Title: main
* @Description: TODO
* @param args
* @return void
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// toXml
// String xmlStr=new PersonTest().toXml();
// toBean
// PersonBean per=new PersonTest().toBean();
String xmlStr = "<person>" + "<firstName>chen</firstName>"
+ "<lastName>youlong</lastName>" + "<telphone>"
+ "<code>137280</code>" + "<number>137280968</number>"
+ "</telphone>" + "<faxphone>" + "<code>20</code>"
+ "<number>020221327</number>" + "</faxphone>" + "<friends>"
+ "<name>A1</name>" + "<name>A2</name>" + "<name>A3</name>"
+ "</friends>" + "<pets>" + "<pet>" + "<name>doly</name>"
+ "<age>2</age>" + "</pet>" + "<pet>" + "<name>Ketty</name>"
+ "<age>2</age>" + "</pet>" + "</pets>" + "</person>";
PersonBean person = XmlUtil.toBean(xmlStr, PersonBean.class);
System.out.println("person=firstname==" + person.getFirstName());
System.out.println("person==Friends==name1=="
+ person.getFriend().getName().get(0));
System.out.println("person==Pets==name2=="
+ person.getPet().getAnimalList().get(1).getName());
}
}