Java xml与实体Bean的转换
程序员文章站
2022-05-29 23:21:34
...
1、pom.xml依赖包:
2、java代码实现转换
bean实体类:
User.java
UserList.java
3、xml转bean
4、bean转xml
bean转xml输出结果:
除了上面示例中用的注解,xstream还有下面几种注解也经常用到。
@XstreamOmitField 忽略字段
这相当于设置某些字段为临时属性,在转换中不再起作用。
@XStreamConverter(XXX.class) 转换器
XXX.class是一个实现了com.thoughtworks.xstream.converters.Converter接口的转换器,对某些类型的值进行转换,比如布尔值类型的true或false,如果不加转换器,默认生成的值就是true或false。xstream自带了BooleanConverter转换器,可以将默认值转换成需要的文本值,如果xstream没有需要的转换器就得自己实现Converter接口来自定义转换器。
根据大象的经验,为了少给自己找麻烦,比如避免使用转换器,最好将与XML元素或属性对应的Java对象属性都设置成String类型,当然列表还是要定义成List类型的。只要不是特别奇葩,一般情况下,示例部分就能满足绝大部分的需求。
<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类型的。只要不是特别奇葩,一般情况下,示例部分就能满足绝大部分的需求。