XML编程总结——使用JAXB进行java对象和xml格式之间的相互转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML编程总结——使用JAXB进行java对象和xml格式之间的相互转换相关的知识,希望对你有一定的参考价值。

(六)使用JAXB进行java对象和xml格式之间的相互转换

JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类。

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

JDK中JAXB相关的重要Class和Interface

JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。

Marshaller接口,将Java对象序列化为XML数据。

Unmarshaller接口,将XML数据反序列化为Java对象。

JDK中JAXB相关的重要Annotation注解不能使用在字段上,只能使用在getter/setter方法上

@XmlType,将Java类或枚举类型映射到XML模式类型

@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。

@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。

@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。

@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。

@XmlRootElement,将Java类或枚举类型映射到XML元素。

@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。

@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。

测试代码:

Student.java:

 1 public class Student {
 2     private String name;
 3     private int age;
 4     private String sex;
 5     private Date birthday;
 6     private String address;
 7     private List<Friend> friends;
 8 
 9     public Student() {
10     }
11 
12     public Student(String name, int age, String sex, Date birthday, String address) {
13         this.name = name;
14         this.age = age;
15         this.sex = sex;
16         this.birthday = birthday;
17         this.address = address;
18     }
19 
20     public String getName() {
21         return name;
22     }
23 
24     public void setName(String name) {
25         this.name = name;
26     }
27 
28     //将age字段变成student的一个属性
29     @XmlAttribute
30     public int getAge() {
31         return age;
32     }
33 
34     public void setAge(int age) {
35         this.age = age;
36     }
37 
38     public String getSex() {
39         return sex;
40     }
41 
42     public void setSex(String sex) {
43         this.sex = sex;
44     }
45 
46     public Date getBirthday() {
47         return birthday;
48     }
49 
50     public void setBirthday(Date birthday) {
51         this.birthday = birthday;
52     }
53 
54     public String getAddress() {
55         return address;
56     }
57 
58     public void setAddress(String address) {
59         this.address = address;
60     }
61 
62     //指定用<friends>标签包围,子标签为<friend>
63     @XmlElementWrapper(name="friends")
64     @XmlElement(name="friend")
65     public List<Friend> getFriends() {
66         return friends;
67     }
68 
69     public void setFriends(List<Friend> friends) {
70         this.friends = friends;
71     }
72 }

Friend.java:

 1 public class Friend {
 2 
 3     private String name;
 4     private int age;
 5     private String address;
 6 
 7     public Friend() {
 8     }
 9 
10     public Friend(String name,int age,String address) {
11         this.name = name;
12         this.age=age;
13         this.address=address;
14     }
15 
16     public String getName() {
17         return name;
18     }
19 
20     public void setName(String name) {
21         this.name = name;
22     }
23 
24     @XmlAttribute
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     public String getAddress() {
34         return address;
35     }
36 
37     public void setAddress(String address) {
38         this.address = address;
39     }
40 }

Students.java:

 1 @XmlRootElement(name="students")
 2 public class Students {
 3 
 4     private List<Student> students;
 5 
 6     @XmlElement(name="student")
 7     public List<Student> getStudents() {
 8         return students;
 9     }
10 
11     public void setStudents(List<Student> students) {
12         this.students = students;
13     }
14 }

JAXBTest.java:

 1 public class JAXBTest {
 2 
 3     /**
 4      * 将java对象转换成xml,并用注解指定生成规则,是生成属性还是生成节点
 5      * @throws Exception
 6      */
 7     @Test
 8     public void testMarshaller() throws Exception{
 9         //获得转换的上下文对象
10         JAXBContext context = JAXBContext.newInstance(Students.class);
11         //获得Marshaller对象
12         Marshaller marshaller = context.createMarshaller();
13         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
14         //将java对象进行转换成xml
15         Students students=new Students();
16         List<Student> list=new ArrayList<Student>();
17         //第一个Student
18         Student student1=new Student("张三",19,"男",new Date(),"北京市怀柔区");
19         List<Friend> friends1=new ArrayList<Friend>();
20         Friend f11=new Friend("李四",20,"北京市新城区");
21         friends1.add(f11);
22         Friend f12=new Friend("王五",18,"北京市朝阳区");
23         friends1.add(f12);
24         student1.setFriends(friends1);
25         list.add(student1);
26         // 第二个Student
27         Student student2 = new Student("李四", 18, "男", new Date(), "北京市怀柔区");
28         List<Friend> friends2 = new ArrayList<Friend>();
29         Friend f21 = new Friend("张三", 20, "北京市新城区");
30         friends2.add(f21);
31         Friend f22 = new Friend("赵六", 18, "北京市朝阳区");
32         friends2.add(f22);
33         student2.setFriends(friends2);
34         list.add(student2);
35         //添加到Students
36         students.setStudents(list);
37         
38         //打印到控制台
39         FileWriter writer=new FileWriter(new File("students.xml"));
40         marshaller.marshal(students, writer);
41         marshaller.marshal(students, System.out);
42     }
43     
44     /**
45      * 读取xml文档,并将xml文档反序列化为java对象
46      * @throws Exception
47      */
48     @Test
49     public void testUnMarshaller() throws Exception{
50         JAXBContext context = JAXBContext.newInstance(Students.class);
51         Unmarshaller unmarshaller = context.createUnmarshaller();
52         File f=new File("students.xml");
53         Students students = (Students) unmarshaller.unmarshal(f);
54         List<Student> list = students.getStudents();
55         for(Student student:list){
56             System.out.println("name:"+student.getName());
57             System.out.println("age:"+student.getAge());
58             System.out.println("address:"+student.getAddress());
59             System.out.println("-----------------------");
60         }
61     }
62 }

输出保存的students.xml:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <students>
 3     <student age="19">
 4         <address>北京市怀柔区</address>
 5         <birthday>2016-10-15T14:59:45.126+08:00</birthday>
 6         <friends>
 7             <friend age="20">
 8                 <address>北京市新城区</address>
 9                 <name>李四</name>
10             </friend>
11             <friend age="18">
12                 <address>北京市朝阳区</address>
13                 <name>王五</name>
14             </friend>
15         </friends>
16         <name>张三</name>
17         <sex>男</sex>
18     </student>
19     <student age="18">
20         <address>北京市怀柔区</address>
21         <birthday>2016-10-15T14:59:45.126+08:00</birthday>
22         <friends>
23             <friend age="20">
24                 <address>北京市新城区</address>
25                 <name>张三</name>
26             </friend>
27             <friend age="18">
28                 <address>北京市朝阳区</address>
29                 <name>赵六</name>
30             </friend>
31         </friends>
32         <name>李四</name>
33         <sex>男</sex>
34     </student>
35 </students>

 

以上是关于XML编程总结——使用JAXB进行java对象和xml格式之间的相互转换的主要内容,如果未能解决你的问题,请参考以下文章

总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)

Java&amp;Xml教程JAXB实现XML与Java对象转换

通过JAXB完成Java对象与XML之间的转换

Java:使用JAXB方式实现xml和对象之间的转化(注解方式)

JAXB - 忽略XML元素

JAXB实现java对象与xml之间转换