JAXB XML和Java物件相互轉化
JAXB XML和Java物件相互轉化)
Jaxb介紹
JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML例項文件反向生成Java物件樹的方法,並能將Java物件樹的內容重新寫到XML例項文件。從另一方面來講,JAXB提供了快速而簡便的方法將XML模式繫結到Java表示,從而使得Java開發者在Java應用程式中能方便地結合XML資料和處理函式。
JAXB 2.0是JDK 1.6的組成部分。JAXB 2.2.3是JDK 1.7的組成部分。
JAXB相關的重要類與介面:
JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。
Marshaller介面,將Java物件序列化為XML資料。
Unmarshaller介面,將XML資料反序列化為Java物件。
JAXB相關的註解:
-
@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屬性。
java 程式
實體關係:假設如下。
- 年級–>老師 一對多
- 老師–>學生 一對多
package com.example.demo.jaxb.pojo;
import javax.xml.bind.annotation.*;
import java.util.List;
/**
* Description: 年級實體
*/
@XmlRootElement(name = "gradeClass")
@XmlType(propOrder = {"className", "teachers"})
public class GradeClass {
@XmlElement
private String className;
@XmlElement
@XmlElementWrapper(name = "teacherList")
private List<Teacher> teachers;
@XmlTransient
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
@XmlTransient
public List<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(List<Teacher> teachers) {
this.teachers = teachers;
}
}
@XmlRootElement(name = “gradeClass”) 此批註定義XML檔案的根元素。
@XmlType(propOrder = {“className”, “teachers”}) 用於定義XML檔案中元素的順序。不寫則按照屬性從上到下排列。
@XmlElement:用於定義XML檔案中的元素,它設定實體名稱。
@XmlElementWrapper(name =‘要賦予該包裝器的名稱’):它圍繞XML表示形式生成一個包裝器元素、。
@XmlTransient註解解決 JavaBean 屬性名稱與欄位名稱之間的名稱衝突,或者用於防止欄位/屬性的對映
package com.example.demo.jaxb.pojo;
import javax.xml.bind.annotation.*;
import java.util.List;
/**
* Description: 老師實體
*/
@XmlRootElement(namespace = "名稱空間")
@XmlType(propOrder = {"name", "age","students"})
public class Teacher {
@XmlElementWrapper(name = "studentList")
@XmlElement(name = "students")
private List<Student> students;
/**
* 名稱
*/
@XmlElement(name = "teacherName")
private String name;
/**
* 年級
*/
@XmlElement(name = "teacherAge")
private String age;
@XmlTransient
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@XmlTransient
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@XmlTransient
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.example.demo.jaxb.pojo;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
/**
* Description:學生實體
*/
public class Student {
/**
* 編號
*/
@XmlElement(name = "id")
private String id;
/**
* 名稱
*/
@XmlElement(name = "studentName")
private String name;
/**
* 年級
*/
@XmlElement(name = "age")
private String age;
@XmlTransient
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@XmlTransient
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlTransient
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
java物件轉化為xml:
package com.example.demo.test;
import com.example.demo.jaxb.pojo.GradeClass;
import com.example.demo.jaxb.pojo.Student;
import com.example.demo.jaxb.pojo.Teacher;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.File;
import java.util.ArrayList;
/**
* Description: 測試
*/
public class JaxbTest {
/**
* java物件轉化為xml
* @param args 引數
*/
public static void main(String[] args) {
Student student = new Student();
student.setId("1");
student.setAge("11");
student.setName("小明");
Student student2 = new Student();
student2.setId("2");
student2.setAge("12");
student2.setName("小紅");
Student student3 = new Student();
student3.setId("3");
student3.setAge("13");
student3.setName("小王");
Student student4 = new Student();
student4.setId("4");
student4.setAge("14");
student4.setName("小劉");
ArrayList<Student> studentArrayList = new ArrayList<>();
studentArrayList.add(student);
studentArrayList.add(student2);
studentArrayList.add(student3);
studentArrayList.add(student4);
Teacher teacher = new Teacher();
teacher.setName("小李老師");
teacher.setAge("18");
teacher.setStudents(studentArrayList);
Teacher teacher2 = new Teacher();
teacher2.setName("小趙老師");
teacher2.setAge("88");
teacher2.setStudents(null);
ArrayList<Teacher> teacherArrayList = new ArrayList<>();
teacherArrayList.add(teacher);
teacherArrayList.add(teacher2);
GradeClass gradeClass = new GradeClass();
gradeClass.setClassName("一年級");
gradeClass.setTeachers(teacherArrayList);
try {
//建立JAXB上下文
JAXBContext jaxbContext = JAXBContext.newInstance(GradeClass.class);
//建立編組物件
Marshaller marshaller = jaxbContext.createMarshaller();
//XML格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
File xMLFile = new File("D:\\Jaxb.xml");
//編組
marshaller.marshal(gradeClass, xMLFile);
//控制檯輸出
marshaller.marshal(gradeClass, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
執行以上程式後,將得到以下輸出.
控制檯輸出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<gradeClass xmlns:ns2="名稱空間">
<className>一年級</className>
<teacherList>
<teachers>
<teacherName>小李老師</teacherName>
<teacherAge>18</teacherAge>
<studentList>
<students>
<id>1</id>
<studentName>小明</studentName>
<age>11</age>
</students>
<students>
<id>2</id>
<studentName>小紅</studentName>
<age>12</age>
</students>
<students>
<id>3</id>
<studentName>小王</studentName>
<age>13</age>
</students>
<students>
<id>4</id>
<studentName>小劉</studentName>
<age>14</age>
</students>
</studentList>
</teachers>
<teachers>
<teacherName>小趙老師</teacherName>
<teacherAge>88</teacherAge>
</teachers>
</teacherList>
</gradeClass>
xml轉化為java物件
package com.example.demo.test;
import com.example.demo.jaxb.pojo.GradeClass;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;
/**
* Description:xml轉化為java物件
*/
public class XMLToJavaTest {
/**
* xml轉化為java物件
*/
public static void main(String[] args) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(GradeClass.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
File xMLFile = new File("D:\\Jaxb.xml");
//解組
GradeClass gradeClass = (GradeClass) jaxbUnmarshaller.unmarshal(xMLFile);
System.out.println("gradeClass.getClassName: " + gradeClass.getClassName());
System.out.println(gradeClass.toString());
} catch (JAXBException e) {
// some exception occured
e.printStackTrace();
}
}
}
可以打斷點進行檢視,比較明顯。控制檯顯示如下:
gradeClass.getClassName: 一年級
[email protected]