使用 JDK(JAXB) XML 和 java對象相互轉換

JAXB GitHub: https://github.com/javaee/jaxb-v2
JAXB Users Guide : https://javaee.github.io/jaxb-v2/doc/user-guide/ch03.html

  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:
- @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屬性。

注意:
- 對於要序列化(marshal)爲XML的Java類,絕不能把成員變量聲明爲public,否則運行將拋出異常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。

  • 對於JAXB相關的重要Annotation的聲明,如@Xml…..,可以放在成員變量的setter()或getter()方法上,兩者中任選其一即可,但決不能放在成員變量上,否則運行將拋出異常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。

環境要求:JDK1.6+

實例一:

package jaxb;

/**
 * Created by sheting on 10/17/2017
 */
public class Classroom {
    private int id;
    private String name;
    private int grade;

    public Classroom() {
    }

    public Classroom(int id, String name, int grade) {
        super();
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }
}
package jaxb;

import javax.xml.bind.annotation.XmlRootElement;

/**
 * Created by sheting on 10/17/2017
 */
@XmlRootElement
public class Student {
    private int id;
    private String name;
    private int age;
    private Classroom classroom;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Classroom getClassroom() {
        return classroom;
    }

    public void setClassroom(Classroom classroom) {
        this.classroom = classroom;
    }

    public Student(int id, String name, int age, Classroom classroom) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.classroom = classroom;
    }

    //無參夠着函數一定需要,否則JXBContext無法正常解析。
    public Student() {
        super();
    }
}
package jaxb;

import org.junit.Test;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;

/**
 * Created by sheting on 10/17/2017
 */
public class TestJaxb {

    @Test
    public void beanToXML() {
        Classroom classroom = new Classroom(1, "軟件工程", 4);
        Student student = new Student(101, "張三", 22, classroom);

        try {
            JAXBContext context = JAXBContext.newInstance(Student.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.marshal(student, System.out);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void XMLStringToBean(){
        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><student><age>22</age><classroom><grade>4</grade><id>1</id><name>軟件工程</name></classroom><id>101</id><name>張三</name></student>";
        try {
            JAXBContext context = JAXBContext.newInstance(Student.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Student student = (Student)unmarshaller.unmarshal(new StringReader(xmlStr));
            System.out.println(student.getAge());
            System.out.println(student.getClassroom().getName());
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

注意:
1、需要轉換的model對象一定要添加@XmlRootElement註解,其裏面的其他對象則不需要
2、需要轉換的model對象一定要有不帶參數的構造方法,包括該對象裏面引用的對象。

實例二:

package com.mkyong.core;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

    String name;
    int age;
    int id;

    public String getName() {
        return name;
    }

    @XmlElement
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    @XmlElement
    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    @XmlAttribute
    public void setId(int id) {
        this.id = id;
    }

}

Convert Object to XML

package com.mkyong.core;

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class JAXBExample {
    public static void main(String[] args) {

      Customer customer = new Customer();
      customer.setId(100);
      customer.setName("mkyong");
      customer.setAge(29);

      try {

        File file = new File("C:\\file.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        // output pretty printed
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        jaxbMarshaller.marshal(customer, file);
        jaxbMarshaller.marshal(customer, System.out);

          } catch (JAXBException e) {
        e.printStackTrace();
          }

    }
}

Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="100">
    <age>29</age>
    <name>mkyong</name>
</customer>

Convert XML to Object

package com.mkyong.core;

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class JAXBExample {
    public static void main(String[] args) {

     try {
        File file = new File("C:\\file.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Customer customer = (Customer) jaxbUnmarshaller.unmarshal(file);
        System.out.println(customer);

      } catch (JAXBException e) {
        e.printStackTrace();
      }
    }
}

Output

Customer [name=mkyong, age=29, id=100]

  
維基百科:https://en.wikipedia.org/wiki/Java_Architecture_for_XML_Binding

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章