Java&Xml教程(十一)JAXB實現XML與Java對象轉換

來源:互聯網
上載者:User

Java&Xml教程(十一)JAXB實現XML與Java對象轉換

JAXB是Java Architecture for XML Binding的縮寫,用於在Java類與XML之間建立映射,能夠協助開發人員很方便的將XML和Java對象進行相互轉換。
本文以一個簡單的例子介紹JAXB的使用,首先我們需要瞭解一下JAXB常用的API。

JAXBContext類,是應用的入口,用於管理XML/Java綁定資訊。 Marshaller介面,將Java對象序列化為XML資料。

Unmarshaller介面,將XML資料還原序列化為Java對象。

@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 Bean內容如下:
Employee.java

package net.csdn.beans;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;@XmlAccessorType(XmlAccessType.FIELD)  @XmlRootElement  @XmlType(name = "Employee", propOrder = { "name", "age", "role", "gender" }) public class Employee {    private String name;    private String gender;    private int age;    private String role;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getRole() {        return role;    }    public void setRole(String role) {        this.role = role;    }    @Override    public String toString() {        return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender="                + this.gender + " Role=" + this.role;    }}

需要轉換為Java對象的XML檔案內容如下:
employee.xml

    Pankaj    29    Java Developer    Male

接下來編寫測試案例代碼:
TestJAXB.java

package net.csdn.test;import java.io.InputStream;import java.io.StringReader;import java.io.StringWriter;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;import net.csdn.beans.Employee;import org.junit.Test;public class TestJAXB {    @Test    public void testXml2Obj() throws Exception {        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("employee.xml");        byte[] bytes = new byte[is.available()];        is.read(bytes);        String xmlStr = new String(bytes);        JAXBContext context = JAXBContext.newInstance(Employee.class);          Unmarshaller unmarshaller = context.createUnmarshaller();          Employee emp = (Employee) unmarshaller.unmarshal(new StringReader(xmlStr));        System.out.println(emp);    }    @Test    public void testObj2Xml() {        Employee  emp = new Employee();        emp.setAge(10);        emp.setGender("Male");        emp.setName("Jane");        emp.setRole("Teacher");        String xmlStr = TestJAXB.convertToXml(emp,"utf-8");          System.out.println(xmlStr);    }    public static String convertToXml(Object obj, String encoding) {          String result = null;          try {              JAXBContext context = JAXBContext.newInstance(obj.getClass());              Marshaller marshaller = context.createMarshaller();              marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);              marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);              StringWriter writer = new StringWriter();              marshaller.marshal(obj, writer);              result = writer.toString();          } catch (Exception e) {              e.printStackTrace();          }          return result;      } }

運行testObj2Xml測試方法,控制台輸出:

<code class=" hljs xml"><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%20standalone%3D%22yes%22%3F%2D%2D%3E--><employee>    <name>Jane</name>    <age>10</age>    <role>Teacher</role>    <gender>Male</gender></employee></code>

運行testXml2Obj測試方法,控制台輸出:

Employee:: Name=Pankaj Age=29 Gender=Male Role=Java Developer

註:本例中使用JUnit4作為單元測試工具,在Eclipse中點擊Window->Show View->OutLine菜單開啟outline視圖,分別在testXml2Obj和testObj2Xml方法上點擊右鍵->Run As->JUnit Test即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.