JAXB 實現java對象與xml之間互相轉換


首先熟悉一下JAXB實現對象與xml互轉時常用的一些注解使用:

1.@XmlRootElement,用於類級別的注解,對應xml的跟元素。通過name屬性定義這個根節點的名稱。

2.@XmlAccessorType,定義映射這個類中的何種類型都需要映射到xml。(如果不存在@XmlAccessorType,默認使用XmlAccessType.PUBLIC_MEMBER注解)

  參數:XmlAccessType.FIELD: java對象中的所有成員變量。

  XmlAccessType.PROPERTY:java對象中所有通過getter/setter方式訪問的成員變量。

  XmlAccessType.PUBLIC_MEMBER:java對象中所有的public訪問權限的成員變量和通過getter/setter方式訪問的成員變量。

  XmlAccessType.NONE: java對象的所有屬性都不映射為xml的元素。

3.@XmlAttribute,用於把java對象的屬性映射為xml的屬性,並可通過name屬性為生成的xml屬性指定別名。

4.@XmlElement,指定一個字段或get/set方法映射到xml的節點。通過name屬性定義這個根節點的名稱。

5.@XmlElementWrapper,為數組或集合定義一個父節點。通過name屬性定義這個父節點的名稱。

 

下面來看一個例子:

先定義一個學生類,Student如下:

復制代碼
 1 package com.quest.software.bus4j.ui.framework.extend.frameParase.test;
 2 
 3 import java.util.List;
 4 
 5 import javax.xml.bind.annotation.XmlAttribute;
 6 import javax.xml.bind.annotation.XmlElement;
 7 import javax.xml.bind.annotation.XmlElementWrapper;
 8 
 9 public class Student {
10     String name;  //姓名
11     String sex;    //性別
12     int number;     //學號
13     String className;    //班級
14     List<String> hobby;    //愛好
15     
16     public Student(){
17     }
18     public Student(String name,String sex,int number,
19             String className,List<String> hobby) {
20         this.name = name;
21         this.sex = sex;
22         this.number = number;
23         this.className = className;
24         this.hobby = hobby;
25     }
26     @XmlAttribute(name="name")  
27     public String getName() {
28         return name;
29     }
30     public void setName(String name) {
31         this.name = name;
32     }
33     
34     @XmlAttribute(name="sex")  
35     public String getSex() {
36         return sex;
37     }
38     public void setSex(String sex) {
39         this.sex = sex;
40     }
41     
42     @XmlAttribute(name="number")  
43     public int getNumber() {
44         return number;
45     }
46     public void setNumber(int number) {
47         this.number = number;
48     }
49     
50     @XmlElement(name="className")  
51     public String getClassName() {
52         return className;
53     }
54     public void setClassName(String className) {
55         this.className = className;
56     }
57     
58     @XmlElementWrapper(name="hobbys")
59     @XmlElement(name = "hobby")
60     public List<String> getHobby() {
61         return hobby;
62     }
63     public void setHobby(List<String> hobby) {
64         this.hobby = hobby;
65     }
66     
67 }
復制代碼

切記,如果java對象屬性同時添加了get和set方法,注解不能定義在屬性的定義上,只需在get或者set方法上定義一個即可,否則jaxb會報錯!!如下:

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
  Class has two properties of the same name "name"

 

然后再定義學生集合類,StudentList如下:

復制代碼
 1 package com.quest.software.bus4j.ui.framework.extend.frameParase.test;
 2 
 3 import java.util.List;
 4 
 5 import javax.xml.bind.annotation.XmlElement;
 6 import javax.xml.bind.annotation.XmlRootElement;
 7 
 8 @XmlRootElement(name="list")
 9 public class StudentList {
10     
11     List<Student> students;    //所有學生信息的集合
12     
13     @XmlElement(name = "student")  
14     public List<Student> getStudents() {
15         return students;
16     }
17     
18     public void setStudents(List<Student> students) {
19         this.students = students;
20     }
21     
22 }
復制代碼

 

最后寫xml和java對象互轉的類(通過Marshaller類實現將對象轉換為xml,同時也可利用Unmarshaller類進行xml轉換為類):

1.java對象轉換為xml:

復制代碼
 1 package com.quest.software.bus4j.ui.framework.extend.frameParase.test;
 2 
 3 import java.io.BufferedWriter;
 4 import java.io.File;
 5 import java.io.FileWriter;
 6 import java.io.IOException;
 7 import java.io.StringWriter;
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 import javax.xml.bind.JAXBContext;
12 import javax.xml.bind.JAXBException;
13 import javax.xml.bind.Marshaller;
14 
15 public class BeanToXml {
16     
17     /**
18      * java對象轉換為xml文件
19      * @param xmlPath  xml文件路徑
20      * @param load    java對象.Class
21      * @return    xml文件的String
22      * @throws JAXBException    
23      */
24     public static String beanToXml(Object obj,Class<?> load) throws JAXBException{
25         JAXBContext context = JAXBContext.newInstance(load);
26         Marshaller marshaller = context.createMarshaller();
27         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
28         marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
29         StringWriter writer = new StringWriter();
30         marshaller.marshal(obj,writer);
31         return writer.toString();
32     }
33     public static void main(String[] args) throws JAXBException, IOException {
34             List<String> hobby = new ArrayList<>();
35             hobby.add("籃球");
36             hobby.add("音樂");
37             hobby.add("乒乓球");
38             
39             List<Student> studentList = new ArrayList<>();
40             
41             Student st = new Student("張三","男",10001,"尖子班",hobby);
42             studentList.add(st);
43             Student st1 = new Student("李四","男",10002,"普通班",hobby);
44             studentList.add(st1);
45             Student st2 = new Student("莉莉","女",10003,"普通班",hobby);
46             studentList.add(st2);
47             
48             StudentList students = new StudentList();
49             students.setStudents(studentList);
50             String str =  BeanToXml.beanToXml(students, StudentList.class);
51             
52             //寫入到xml文件中
53             String xmlPath = "D:/testConfig.xml";
54             BufferedWriter bfw = new BufferedWriter(new FileWriter(new File(xmlPath)));
55             bfw.write(str);
56             bfw.close();
57     }
58 }
復制代碼

測試生成的xml文件如下圖:

 

2.xml轉換為java對象:

復制代碼
復制代碼
 1 package com.quest.software.bus4j.ui.framework.extend.frameParase.test;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.util.List;
 6 
 7 import javax.xml.bind.JAXBContext;
 8 import javax.xml.bind.JAXBException;
 9 import javax.xml.bind.Unmarshaller;
10 
11 public class XmlToBean {
12     
13     /**
14      * xml文件配置轉換為對象
15      * @param xmlPath  xml文件路徑
16      * @param load    java對象.Class
17      * @return    java對象
18      * @throws JAXBException    
19      * @throws IOException
20      */
21     public static Object xmlToBean(String xmlPath,Class<?> load) throws JAXBException, IOException{
22         JAXBContext context = JAXBContext.newInstance(load);  
23         Unmarshaller unmarshaller = context.createUnmarshaller(); 
24         Object object = unmarshaller.unmarshal(new File(xmlPath));
25         return object;
26     }
27     
28     public static void main(String[] args) throws IOException, JAXBException {
29         String xmlPath =  "D:/testConfig.xml";
30         Object object = XmlToBean.xmlToBean(xmlPath,StudentList.class);
31         StudentList students = (StudentList)object;
32         List<Student> studentList = students.getStudents();
33         
34         for(int i=0;i<studentList.size();i++){
35             System.out.println(studentList.get(i).name);
36             System.out.println(studentList.get(i).sex);
37             System.out.println(studentList.get(i).number);
38             System.out.println(studentList.get(i).className);
39             for(String str :studentList.get(i).hobby){
40                 System.out.print(str+" ");
41             }
42             System.out.println("-------------");
43         }
44     }
45 }
復制代碼

 

復制代碼

測試打印的結果如下:

張三

10001
尖子班
籃球 音樂 乒乓球 -------------
李四

10002
普通班
籃球 音樂 乒乓球 -------------
莉莉

10003
普通班
籃球 音樂 乒乓球 -------------

有不明白的可以聯系我,互相交流!
jaxb雖然挺實用,但是在xml轉java對象時xml文件不能配置錯了,必須嚴格按照自己定義的java對象的注解來編寫xml文件,否則jaxb里面報錯很難查錯!!!

惆悵,是因為自己不夠陽光。


免責聲明!

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



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