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

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

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

2.@XmlAccessorType,定義映射這個類中的何種類型都須要映射到xml。(若是不存在@XmlAccessorType,默認使用XmlAccessType.PUBLIC_MEMBER註解)app

  參數:XmlAccessType.FIELD: java對象中的全部成員變量。測試

  XmlAccessType.PROPERTY:java對象中全部經過getter/setter方式訪問的成員變量。ui

  XmlAccessType.PUBLIC_MEMBER:java對象中全部的public訪問權限的成員變量和經過getter/setter方式訪問的成員變量。this

  XmlAccessType.NONE: java對象的全部屬性都不映射爲xml的元素。spa

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

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

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裏面報錯很難查錯!!!

相關文章
相關標籤/搜索