XStream對象相當Java對象和XML之間的轉換器,轉換過程是雙向的。建立XSteam對象的方式很簡單,只需要new XStream()即可。
Java到xml,用toXML()方法。
Xml到Java,用fromXML()方法。
在沒有任何預設配置的情況下,java到xml的映射,是java成員名對應xml的元素名,java類的全名對應xml根項目的名字。而實際中,往往是xml和java類都有了,要完成相互轉換,必須進行別名映射。
別名配置包含三種情況:
1、類別名,用alias(Stringname, Class type)。
2、類成員別名,用aliasField(Stringalias, Class definedIn, String fieldName)
3、類成員作為屬性別名,用aliasAttribute(Class definedIn, String attributeName, String alias),單獨命名沒有意義,還要通過useAttributeFor(ClassdefinedIn, String fieldName) 應用到某個類上。
XStreamAnnotation
@XStreamAlias("Alias Name"): usedto alias Class name and field
@XStreamAsAttribute():add attribute for Class
@XStreamImplicit() 或者 @XStreamImplicit(itemFieldName = "Group")重新指定名字
XML解析器
1. XPP3 (需要xpp3-[version].jar)
XStream xstream = new XStream(new XppDriver());
2. JAXP DOM
XStream xstream = new XStream(new DomDriver()); 不指定編碼解析器
XStream xstream = new XStream(newDomDriver(“UTF-8”)); 指定編碼解析器
XStreamd的一些小bug
--在定義別名中的底線“_”轉換為xml後會變成“__”這個符號. 因此,盡量避免在別名中實用任何符號,卻是需要底線的時候,可以考慮實用串連符“-”,這個沒有問題。
--Java Bean中常常有一些常量,在轉換過程,XStream也會將這些常量轉換過去,形成常量的xml節點,這顯然不是想要的結果,對於常量欄位,就不做轉換了。
代碼清單1:
package test;
importcom.thoughtworks.xstream.annotations.XStreamAlias;
importcom.thoughtworks.xstream.annotations.XStreamAsAttribute;
@XStreamAlias("ADDRESS")
public class Address {
private String add;
@XStreamAsAttribute()
private String zipcode;
public Address(String add, String zipcode) {
this.add = add;
this.zipcode = zipcode;
}
public String toString() {
return "Address{"
+ "add='" + add +'\''
+ ", zipcode='" +zipcode + '\''
+ '}';
}
}
代碼清單2:
package test;
importcom.thoughtworks.xstream.annotations.XStreamAlias;
importcom.thoughtworks.xstream.annotations.XStreamOmitField;
import java.util.List;
@XStreamAlias("PERSON")
public class Person {
@XStreamAlias("Name")
private String name;
//使用@XStreamOmitField對不產生xml的欄位加註釋
//然後代碼中使用xstream.autodetectAnnotations(true); 就可以完成去掉屬性了
@XStreamOmitField
private String age;
private Profileprofile;
@XStreamImplicit()
private List<Address> addlist;
public Person(String name, String age, Profile profile,List<Address> addlist) {
this.name = name;
this.age = age;
this.profile = profile;
this.addlist = addlist;
}
public String toString() {
return "Person{"
+ "name='" + name + '\''
+ ", age='" + age +'\''
+ ", profile=" +profile
+ ", addlist=" +addlist
+ '}';
}
}
代碼清單3:
package test;
importcom.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("PROFILE")
public class Profile {
private String job;
private String tel;
private String remark;
public Profile(String job, String tel, String remark) {
this.job = job;
this.tel = tel;
this.remark = remark;
}
public String toString() {
return "Profile{"
+ "job='" + job +'\''
+ ", tel='" + tel +'\''
+ ", remark='" +remark + '\''
+ '}';
}
}
代碼清單4:
/*
* Tochange this template, choose Tools | Templates
*and open the template in the editor.
*/