1. 程式人生 > 其它 >JAXB XML和Java物件相互轉化

JAXB XML和Java物件相互轉化

技術標籤:xmljava

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]