java xml/bean转换

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模式类型

  • propOrder:自定义排序

@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)
//@XmlType(propOrder = {"name", "id", "sex", "age"})
@XmlRootElement
public class User {
@XmlAttribute
private Long id;

@XmlElement(name = "nickname")
private String name;

private Integer age;

private Boolean sex;

@XmlElementRef
private Account account;
//getter setter toString省略。。。
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
@XmlRootElement
public class Account {

private String username;

private String password;
//getter setter toString省略。。。
}

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 = JAXBContext.newInstance(User.class);
//创建一个可用于将java内容树转换为XML数据的Marshaller对象
Marshaller marshaller = jaxbContext.createMarshaller();
//指定编组的XML数据是否使用换行符和缩进格式化的属性的名称
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//将解析的xml封装到StringWriter中
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){
//bean转换成xml的结果
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 = JAXBContext.newInstance(User.class);
//创建一个可以将XML数据转换为java内容树的 Unmarshaller对象
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
//解析StringReader中的xml
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'}}