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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM