1、pom.xml依赖包:
class="java">
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
2、java代码实现转换
bean实体类:
User.java
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
// 别名注解,这个别名就是XML文档中的元素名,Java的属性名不一定要与别名一致
@XStreamAlias("user")
public class User {
@XStreamAlias("name")
private String name;
@XStreamAlias("age")
private String age;
@XStreamAlias("id")
// 属性注解,此price就是book的属性,在XML中显示为:<user id="1">
@XStreamAsAttribute
private Integer id;
@XStreamAlias("address")
private String address;
@XStreamAlias("card")
private String card;
@XStreamAlias("gender")
private String gender;
/** setter和getter省略 */
}
UserList.java
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import java.util.ArrayList;
import java.util.List;
@XStreamAlias("users")
public class UserList {
@XStreamAlias("value")
@XStreamAsAttribute
private String value;
// 隐式集合,加上这个注解可以去掉book集合最外面的<list></list>这样的标记
@XStreamImplicit
private List<User> list = new ArrayList<User>();
public void addUser(User user){
this.list.add(user);
}
/** setter和getter省略 */
}
3、xml转bean
public static void xmlToBean(){
String xmlStr ="<users value=\"0\">\n" +
" <user id=\"1\">\n" +
" <name>jiandequn</name>\n" +
" <age>29</age>\n" +
" <address>深圳市西丽白芒村</address>\n" +
" <card>1546464</card>\n" +
" <gender>male</gender>\n" +
" </user>\n" +
"</users>";
XStream xStream = new XStream(new DomDriver("utf-8"));
xStream.processAnnotations(UserList.class);; // 识别obj类中的注解
UserList userList = (UserList) xStream.fromXML(xmlStr);
System.out.println(userList.getValue());
}
4、bean转xml
public static void beanToXml(){
User user = new User();
user.setAddress("深圳市西丽白芒村");
user.setAge("29");
user.setCard("1546464");
user.setId(1);
user.setGender("male");
user.setName("jiandequn");
UserList userList = new UserList();
userList.setValue("0");
userList.addUser(user);
XStream xStream = new XStream(new DomDriver("utf-8"));
xStream.processAnnotations(userList.getClass());; // 识别obj类中的注解
// 以压缩的方式输出XML
// StringWriter sw = new StringWriter();
// xStream.marshal(userList, new CompactWriter(sw));
// 以格式化的方式输出XML
System.out.println( xStream.toXML(userList));
}
bean转xml输出结果:
<users value="0">
<user id="1">
<name>jiandequn</name>
<age>29</age>
<address>深圳市西丽白芒村</address>
<card>1546464</card>
<gender>male</gender>
</user>
</users>
除了上面示例中用的注解,xstream还有下面几种注解也经常用到。
@XstreamOmitField 忽略字段
这相当于设置某些字段为临时属性,在转换中不再起作用。
@XStreamConverter(XXX.class) 转换器
XXX.class是一个实现了com.thoughtworks.xstream.converters.Converter
接口的转换器,对某些类型的值进行转换,比如布尔
值类型的true或false,如果不加转换器,默认生成的值就是true或false。xstream自带了BooleanConverter转换器,可以将默认值转换成需要的文本值,如果xstream没有需要的转换器就得自己实现Converter接口来
自定义转换器。
根据大象的经验,为了少给自己找麻烦,比如避免使用转换器,最好将与
XML元素或属性对应的Java对象属性都设置成String类型,当然列表还是要定义成List类型的。只要不是特别奇葩,一般情况下,示例部分就能满足绝大部分的需求。