jdk提供了JAXB来解析bean和xml之间的转换
常用注解
@XmlTransient:不参与序列化(有该注解表示瞬态,没有表示非瞬态)
@XmlAccessorType:控制字段或属性是否序列化
- XmlAccessorType.FIELD:类中的每个非静态、非瞬态字段将自动绑定到XML
- XmlAccessorType.NONE:没有字段或属性绑定到XML,除非使用特定的注解
- XmlAccessorType.PROPERTY:类中的getter / setter对将被自动绑定到XML,除了瞬态的
- XmlAccessorType.PUBLIC_MEMBER:默认的序列化。类中的公共getter / setter对和每个公共字段将被自动绑定到XML,除了瞬态的
@XmlAccessorOrder:控制类中字段和属性的顺序
- XmlAccessOrder.ALPHABETICAL:排序按照String.compareTo方法确定的字母顺序
- XmlAccessOrder.UNDEFINED:默认的排序。按照类中字段的顺序排序
@XmlType:将类或枚举类型映射到XML模式类型
@XmlRootElement:根目录,默认为类名称。此注解必须有
@XmlAttribute:将类属性映射到XML属性,默认为字段名称
@XmlElement:将类属性映射到XML元素,默认为字段名称。当序列化为XmlAccessorType.NONE或修改映射名称时使用
@XmlElementRef:映射其他类属性到XML元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| @XmlAccessorType(XmlAccessType.FIELD) @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
@XmlRootElement public class User { @XmlAttribute private Long id;
@XmlElement(name = "nickname") private String name;
private Integer age;
private Boolean sex;
@XmlElementRef private Account account; }
@XmlAccessorType(XmlAccessType.FIELD) @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL) @XmlRootElement public class Account {
private String username;
private String password; }
|
bean转xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public static void main(String[] args){ User user = new User(); user.setId(1L); user.setName("xiaoming"); user.setAge(18); user.setSex(true); Account account = new Account(); account.setUsername("admin"); account.setPassword("123456"); user.setAccount(account); JAXBContext jaxbContext = JAXBContext.newInstance(User.class); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter writer = new StringWriter(); marshaller.marshal(user, writer); System.out.println(writer.toString()); }
|
结果:
1 2 3 4 5 6 7 8 9 10
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <user id="1"> <account> <password>123456</password> <username>admin</username> </account> <age>18</age> <nickname>xiaoming</nickname> <sex>true</sex> </user>
|
xml转bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public static void main(String[] args){ String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<user id=\"1\">\n" + " <account>\n" + " <password>123456</password>\n" + " <username>admin</username>\n" + " </account>\n" + " <age>18</age>\n" + " <nickname>xiaoming</nickname>\n" + " <sex>true</sex>\n" + "</user>"; JAXBContext jaxbContext = JAXBContext.newInstance(User.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); StringReader reader = new StringReader(xml); Object unmarshal = unmarshaller.unmarshal(reader); System.out.println(unmarshal); }
|
结果:
1
| User{id=1, name='xiaoming', age=18, sex=true, account=Account{username='admin', password='123456'}}
|