XStream简介

用XStream可以很简单的将xml字符串和bean进行相互转换,具体代码如下。

先写一下XStreamFactory。用来对xml的字符进行处理。
public class XStreamFactory {
public static String PREFIX_CDATA = "<![CDATA[";
public static String SUFFIX_CDATA = "]]>";
/**
* 初始化XStream 可支持某一字段可以加入CDATA标签 如果需要某一字段使用原文
* 就需要在String类型的text的头加上"<![CDATA["和结尾处加上"]]>"标签, 以供XStream输出时进行识别
* @param isAddCDATA
* 是否支持CDATA标签
* @return
*/
public static XStream init(boolean isAddCDATA) {
XStream xstream = null;
if (isAddCDATA) {
xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
protected void writeText(QuickWriter writer, String text) {
// 这里的意思就是如果xml串的每行标签里的内容有<![CDATA[和]]>,则将这两个去掉,而在需要组装返回给微信服务器的xml串时,如果每行标签里的内容没有<![CDATA[和]]>,则在前后加上这两个。
if (text.startsWith(PREFIX_CDATA)) {
text = text.replace(PREFIX_CDATA, "");
text = text.replace(SUFFIX_CDATA, "");
writer.write(text);
return;
}
if (!text.startsWith(PREFIX_CDATA)) {
text = PREFIX_CDATA + text + SUFFIX_CDATA;
}
writer.write(text);
}
};
};
});
} else {
xstream = new XStream();
}
return xstream;
}
}
如果需要对xml的字符进行处理,则需要在定义XStream里重写XppDriver的createWriter方法,就可以自定义xml的格式和处理字符内容。
微信服务器推送消息时发的xml串,每行的内容包括<![CDATA[开头和]]>结尾。上面的XStreamFactory就可以将每行内容里的<![CDATA[和]]>处理掉,同时返回到微信服务器的xml又可以加了<![CDATA[开头和]]>结尾。
下面介绍xml串和bean的简单互转。bean里面有对象属性
public class Address {
private String province;
private String city;
private String district;
public Address(String province, String city, String district) {
super();
this.province = province;
this.city = city;
this.district = district;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDistrict() {
return district;
}
public void setDistrict(String district) {
this.district = district;
}
@Override
public String toString() {
return "province = " + province + " city = " + city + " district = " + district;
}
}
具体的对象
public class User {
private String username;
private String email;
private Address address;
public User(String username, String email, Address address) {
super();
this.username = username;
this.email = email;
this.address = address;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "username = " + username + " email = " + email;
}
}
测试类:
public class TestXStream {
public static void main(String[] args) {
Address address1 = new Address("广东省", "深圳市", "南山区");
User user = new User("koko", "[email protected]", address1);
XStream xstream = XStreamFactory.init(false);
xstream.alias("user", User.class);
String xmlStr = xstream.toXML(user);
System.out.println(xmlStr);
System.out.println("-------------------------------------------");
User userBak = (User)xstream.fromXML(xmlStr);
System.out.println(userBak);
System.out.println(userBak.getAddress());
}
}
输出如下:
<user>
<username>koko</username>
<email>[email protected]</email>
<address>
<province>广东省</province>
<city>深圳市</city>
<district>南山区</district>
</address>
</user>
-------------------------------------------
username = koko email = [email protected]
province = 广东省 city = 深圳市 district = 南山区
 
如果bean里面是一个对象的集合,在转换成xml的时候加上xstream.alias("address", Address.class);其实这个xstream.alias();是加别名,只要转换时xml的标签里出现了的类的全路径,即需要加一个别名来控制。
public class User {
private String username;
private String email;
private List<Address> addressList;
public User(String username, String email, List<Address> addressList) {
super();
this.username = username;
this.email = email;
this.addressList = addressList;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public List<Address> getAddressList() {
return addressList;
}
public void setAddressList(List<Address> addressList) {
this.addressList = addressList;
}
@Override
public String toString() {
return "username = " + username + " email = " + email;
}
}
测试类:
public class TestXStream {
public static void main(String[] args) {
List<Address> lists = new ArrayList<>();
Address address1 = new Address("广东省", "深圳市", "南山区");
Address address2 = new Address("湖南省", "长沙市", "望城区");
lists.add(address1);
lists.add(address2);
User user = new User("koko", "[email protected]", lists);
XStream xstream = XStreamFactory.init(false);
xstream.alias("user", User.class);
xstream.alias("address", Address.class);
String xmlStr = xstream.toXML(user);
System.out.println(xmlStr);
System.out.println("-------------------------------------------");
User userBak = (User)xstream.fromXML(xmlStr);
System.out.println(userBak);
for(Address address : userBak.getAddressList()) {
System.out.println(address);
}
}
}
 
输出结果:
<user>
<username>koko</username>
<email>[email protected]</email>
<addressList>
<address>
<province>广东省</province>
<city>深圳市</city>
<district>南山区</district>
</address>
<address>
<province>湖南省</province>
<city>长沙市</city>
<district>望城区</district>
</address>
</addressList>
</user>
-------------------------------------------
username = koko email = [email protected]
province = 广东省 city = 深圳市 district = 南山区
province = 湖南省 city = 长沙市 district = 望城区
以上即为XStream相互转换xml字符串和bean,简单易用。

猜你喜欢

转载自wydhzxxdwzlmmfdz.iteye.com/blog/2422872