Java對象和XML相互轉換

https://blog.csdn.net/liliang_11676/article/details/81837215php

最近在項目中一直出現Java對象和XML之間的相互轉換,一開始因爲項目很龐大,我又是臨時調度過去,致使在按照項目組長的要求進行寫代碼的同時,老是在這塊雲裏霧裏,最近才慢慢開始搞清楚項目中具體的使用原因。可是項目中封裝的代碼老是很龐大,由於要考慮太多的東西,而對於此,我只能經過小的Demo來講明,其實在項目中用到不少插件,輕巧,靈便,封裝很好使用,但這裏我講解的是JAXB(JavaArchitecture for XML Binding)。java

    JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項能夠根據XML Schema產生Java類的技術。該過程當中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,並能將Java對象樹的內容從新寫到XML實例文檔。從另外一方面來說,JAXB提供了快速而簡便的方法將XML模式綁定到Java表示,從而使得Java開發者在Java應用程序中能方便地結合XML數據和處理函數。程序員

   JDK中JAXB相關的重要Class和Interface:(來源於百度百科JAXB)數據庫

  • JAXBContext類,是應用的入口,用於管理XML/Java綁定信息。
  • Marshaller接口,將Java對象序列化爲XML數據。
  • Unmarshaller接口,將XML數據反序列化爲Java對象。

   JDK中JAXB相關的重要Annotation:(來源於百度百科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屬性。

    在以上的註解中,用的最多的是@XMLType,@XmlAccessorType,@XmlRootElement。緩存

    使用JAXB的原因:app

    1,在項目中,有時候會有不少的XML文件,但若是能夠將這些文件經過對象的方式去操做,就會減小不少操做問題,並且更加符合程序員的編碼方式,框架

    2,在項目中,有時候會遇到一個頁面中存在不少的實體類中的數據,並且有時候有些數據不是必需的,就是說能夠經過DTO來編寫這些實體類,但有時候須要將這些DTO進行預先存儲,不是存儲到數據庫中,這樣就有兩種思路,能夠存儲在內存中,也能夠存儲在硬盤上,此時就能夠經過將Java對象轉換成XML文件存儲,或者變成String類型進行存儲在內存中。ide

    3,給出一個場景,好比說,一個頁面中有不少個模塊構成,可是這些模塊都是屬於一個總體的模塊,當用戶有操做其中幾個模塊的時候,但操做後的數據不是最終的數據,那這個時候首先要保存當前頁面中的數據(Done),而後到其餘頁面進行其餘操做後再轉到這個頁面,那麼以前那個頁面中的數據應該還會存在,用戶能夠方便查看。可是因爲模塊較多,若是以前就存到數據庫中就會形成浪費,由於其不是最終的保存效果,而當用戶想進行保存(Save),此時才進行將最終的數據保存到數據庫中。在這個過程當中就會用到大量的臨時數據,而解決這個問題很好的方法就是能夠用XML保存頁面中當前的數據。函數

    在本文中,首先我給出一個對象與XML的相互轉換,而後,在經過模塊的概念闡述要點三種的場景,固然,代碼不難,很簡單的模擬,對於項目中的概念會比這複雜不少,也會有專門複雜這個過程的代碼編寫。因此,我僅僅是拋磚引玉,可以讓讀者儘可能有這種思想,到時候寫項目的時候若是有遇到此種狀況,就能夠很好的進行思想遷移。

     說這麼多,就來看看到底如何進行Java對象和XML之間的相互轉換吧。

     首先看看Java項目的結構圖:

首先給出User.java這個類

User.java

  1.  
    package com.xml;
  2.  
     
  3.  
    import java.io.Serializable;
  4.  
    import java.util.Date;
  5.  
     
  6.  
    import javax.xml.bind.annotation.XmlAccessType;
  7.  
    import javax.xml.bind.annotation.XmlAccessorType;
  8.  
    import javax.xml.bind.annotation.XmlRootElement;
  9.  
    import javax.xml.bind.annotation.XmlType;
  10.  
     
  11.  
    /**
  12.  
    *
  13.  
    * @author Steven
  14.  
    *
  15.  
    */
  16.  
    @XmlAccessorType(XmlAccessType.FIELD)
  17.  
    // XML文件中的根標識
  18.  
    @XmlRootElement(name = "User")
  19.  
    // 控制JAXB 綁定類中屬性和字段的排序
  20.  
    @XmlType(propOrder = {
  21.  
    "userId",
  22.  
    "userName",
  23.  
    "password",
  24.  
    "birthday",
  25.  
    "money",
  26.  
    })
  27.  
    public class User implements Serializable {
  28.  
    private static final long serialVersionUID = 1L;
  29.  
     
  30.  
    // 用戶Id
  31.  
    private int userId;
  32.  
    // 用戶名
  33.  
    private String userName;
  34.  
    // 用戶密碼
  35.  
    private String password;
  36.  
    // 用戶生日
  37.  
    private Date birthday;
  38.  
    // 用戶錢包
  39.  
    private double money;
  40.  
     
  41.  
    public User() {
  42.  
    super();
  43.  
    }
  44.  
     
  45.  
    public User(int userId, String userName, String password, Date birthday,
  46.  
    double money) {
  47.  
    super();
  48.  
    this.userId = userId;
  49.  
    this.userName = userName;
  50.  
    this.password = password;
  51.  
    this.birthday = birthday;
  52.  
    this.money = money;
  53.  
    }
  54.  
     
  55.  
    public int getUserId() {
  56.  
    return userId;
  57.  
    }
  58.  
     
  59.  
    public void setUserId(int userId) {
  60.  
    this.userId = userId;
  61.  
    }
  62.  
     
  63.  
    public String getUserName() {
  64.  
    return userName;
  65.  
    }
  66.  
     
  67.  
    public void setUserName(String userName) {
  68.  
    this.userName = userName;
  69.  
    }
  70.  
     
  71.  
    public String getPassword() {
  72.  
    return password;
  73.  
    }
  74.  
     
  75.  
    public void setPassword(String password) {
  76.  
    this.password = password;
  77.  
    }
  78.  
     
  79.  
    public Date getBirthday() {
  80.  
    return birthday;
  81.  
    }
  82.  
     
  83.  
    public void setBirthday(Date birthday) {
  84.  
    this.birthday = birthday;
  85.  
    }
  86.  
     
  87.  
    public double getMoney() {
  88.  
    return money;
  89.  
    }
  90.  
     
  91.  
    public void setMoney(double money) {
  92.  
    this.money = money;
  93.  
    }
  94.  
     
  95.  
    @Override
  96.  
    public String toString() {
  97.  
    return "User [birthday=" + birthday + ", money=" + money
  98.  
    + ", password=" + password + ", userId=" + userId
  99.  
    + ", userName=" + userName + "]";
  100.  
    }
  101.  
     
  102.  
    }

 此時給出最重要的進行Java對象和XML文件相互操做的核心代碼XMLUtil.java,其中有着兩種方式進行轉換,一種是轉換成對象和string類型的xml轉換,一種是對象和xml文件進行轉換。

XMLUtil.java

  1.  
    package com.xml;
  2.  
     
  3.  
    import java.io.FileNotFoundException;
  4.  
    import java.io.FileReader;
  5.  
    import java.io.FileWriter;
  6.  
    import java.io.IOException;
  7.  
    import java.io.StringReader;
  8.  
    import java.io.StringWriter;
  9.  
     
  10.  
    import javax.xml.bind.JAXBContext;
  11.  
    import javax.xml.bind.JAXBException;
  12.  
    import javax.xml.bind.Marshaller;
  13.  
    import javax.xml.bind.Unmarshaller;
  14.  
     
  15.  
    /**
  16.  
    * 封裝了XML轉換成object,object轉換成XML的代碼
  17.  
    *
  18.  
    * @author Steven
  19.  
    *
  20.  
    */
  21.  
    public class XMLUtil {
  22.  
    /**
  23.  
    * 將對象直接轉換成String類型的 XML輸出
  24.  
    *
  25.  
    * @param obj
  26.  
    * @return
  27.  
    */
  28.  
    public static String convertToXml(Object obj) {
  29.  
    // 建立輸出流
  30.  
    StringWriter sw = new StringWriter();
  31.  
    try {
  32.  
    // 利用jdk中自帶的轉換類實現
  33.  
    JAXBContext context = JAXBContext.newInstance(obj.getClass());
  34.  
     
  35.  
    Marshaller marshaller = context.createMarshaller();
  36.  
    // 格式化xml輸出的格式
  37.  
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
  38.  
    Boolean.TRUE);
  39.  
    // 將對象轉換成輸出流形式的xml
  40.  
    marshaller.marshal(obj, sw);
  41.  
    } catch (JAXBException e) {
  42.  
    e.printStackTrace();
  43.  
    }
  44.  
    return sw.toString();
  45.  
    }
  46.  
     
  47.  
    /**
  48.  
    * 將對象根據路徑轉換成xml文件
  49.  
    *
  50.  
    * @param obj
  51.  
    * @param path
  52.  
    * @return
  53.  
    */
  54.  
    public static void convertToXml(Object obj, String path) {
  55.  
    try {
  56.  
    // 利用jdk中自帶的轉換類實現
  57.  
    JAXBContext context = JAXBContext.newInstance(obj.getClass());
  58.  
     
  59.  
    Marshaller marshaller = context.createMarshaller();
  60.  
    // 格式化xml輸出的格式
  61.  
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
  62.  
    Boolean.TRUE);
  63.  
    // 將對象轉換成輸出流形式的xml
  64.  
    // 建立輸出流
  65.  
    FileWriter fw = null;
  66.  
    try {
  67.  
    fw = new FileWriter(path);
  68.  
    } catch (IOException e) {
  69.  
    e.printStackTrace();
  70.  
    }
  71.  
    marshaller.marshal(obj, fw);
  72.  
    } catch (JAXBException e) {
  73.  
    e.printStackTrace();
  74.  
    }
  75.  
    }
  76.  
     
  77.  
    @SuppressWarnings("unchecked")
  78.  
    /**
  79.  
    * 將String類型的xml轉換成對象
  80.  
    */
  81.  
    public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
  82.  
    Object xmlObject = null;
  83.  
    try {
  84.  
    JAXBContext context = JAXBContext.newInstance(clazz);
  85.  
    // 進行將Xml轉成對象的核心接口
  86.  
    Unmarshaller unmarshaller = context.createUnmarshaller();
  87.  
    StringReader sr = new StringReader(xmlStr);
  88.  
    xmlObject = unmarshaller.unmarshal(sr);
  89.  
    } catch (JAXBException e) {
  90.  
    e.printStackTrace();
  91.  
    }
  92.  
    return xmlObject;
  93.  
    }
  94.  
     
  95.  
    @SuppressWarnings("unchecked")
  96.  
    /**
  97.  
    * 將file類型的xml轉換成對象
  98.  
    */
  99.  
    public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
  100.  
    Object xmlObject = null;
  101.  
    try {
  102.  
    JAXBContext context = JAXBContext.newInstance(clazz);
  103.  
    Unmarshaller unmarshaller = context.createUnmarshaller();
  104.  
    FileReader fr = null;
  105.  
    try {
  106.  
    fr = new FileReader(xmlPath);
  107.  
    } catch (FileNotFoundException e) {
  108.  
    e.printStackTrace();
  109.  
    }
  110.  
    xmlObject = unmarshaller.unmarshal(fr);
  111.  
    } catch (JAXBException e) {
  112.  
    e.printStackTrace();
  113.  
    }
  114.  
    return xmlObject;
  115.  
    }
  116.  
    }

下面給出測試類Test.java

  1.  
    package com.xml;
  2.  
     
  3.  
    import java.util.Date;
  4.  
     
  5.  
    /**
  6.  
    *
  7.  
    * @author Steven
  8.  
    *
  9.  
    */
  10.  
    public class Test {
  11.  
    public static void main(String[] args) {
  12.  
    // 建立須要轉換的對象
  13.  
    User user = new User(1, "Steven", "@sun123", new Date(), 1000.0);
  14.  
    System. out.println("---將對象轉換成string類型的xml Start---");
  15.  
    // 將對象轉換成string類型的xml
  16.  
    String str = XMLUtil.convertToXml(user);
  17.  
    // 輸出
  18.  
    System. out.println(str);
  19.  
    System. out.println("---將對象轉換成string類型的xml End---");
  20.  
    System. out.println();
  21.  
    System. out.println("---將String類型的xml轉換成對象 Start---");
  22.  
    User userTest = (User) XMLUtil.convertXmlStrToObject(User.class, str);
  23.  
    System. out.println(userTest);
  24.  
    System. out.println("---將String類型的xml轉換成對象 End---");
  25.  
    }
  26.  
    }

 

第二種方式的測試類以下所示;

Test.java

  1.  
    package com.xml;
  2.  
     
  3.  
    import java.util.Date;
  4.  
     
  5.  
    /**
  6.  
    *
  7.  
    * @author Steven
  8.  
    *
  9.  
    */
  10.  
    public class Test {
  11.  
    public static void main(String[] args) {
  12.  
    // 建立須要轉換的對象
  13.  
    User user = new User(1, "Steven", "@sun123", new Date(), 1000.0);
  14.  
     
  15.  
    String path = "D:\\user.xml";
  16.  
    System. out.println("---將對象轉換成File類型的xml Start---");
  17.  
    XMLUtil.convertToXml(user, path);
  18.  
    System. out.println("---將對象轉換成File類型的xml End---");
  19.  
    System. out.println();
  20.  
    System. out.println("---將File類型的xml轉換成對象 Start---");
  21.  
    User user2 = (User) XMLUtil.convertXmlFileToObject(User.class, path);
  22.  
    System. out.println(user2);
  23.  
    System. out.println("---將File類型的xml轉換成對象 End---");
  24.  
    }
  25.  
    }

此時在D:\產生的文件如圖3所示:

此時打開user.xml,內容以下所示:

  1.  
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2.  
    <User>
  3.  
    <userId>1</userId>
  4.  
    <userName>Steven</userName>
  5.  
    <password>@sun123</password>
  6.  
    <birthday>2013-12-13T18:24:03.477+08:00</birthday>
  7.  
    <money>1000.0</money>
  8.  
    </User>

此時就是一個對象和XML間的相互轉換過程,可是對於實際中會有不少的狀況,在User中存在一個子模塊Computer,這時候就須要將Computer做爲User的一個屬性,此時的代碼以下所示:

Computer.java

  1.  
    package com.xml;
  2.  
     
  3.  
    import java.io.Serializable;
  4.  
    import java.util.Date;
  5.  
     
  6.  
    import javax.xml.bind.annotation.XmlAccessType;
  7.  
    import javax.xml.bind.annotation.XmlAccessorType;
  8.  
    import javax.xml.bind.annotation.XmlRootElement;
  9.  
    import javax.xml.bind.annotation.XmlType;
  10.  
     
  11.  
    /**
  12.  
    * 電腦類
  13.  
    *
  14.  
    * @author Steven
  15.  
    *
  16.  
    */
  17.  
    @XmlAccessorType(XmlAccessType.FIELD)
  18.  
    @XmlRootElement(name = "Computer")
  19.  
    @XmlType(propOrder = { "serialNumber", "brandName", "productDate", "price" })
  20.  
    public class Computer implements Serializable {
  21.  
    private static final long serialVersionUID = 1L;
  22.  
     
  23.  
    // 序列號
  24.  
    private String serialNumber;
  25.  
    // 品牌名
  26.  
    private String brandName;
  27.  
    // 生成日期
  28.  
    private Date productDate;
  29.  
    // 價格
  30.  
    private double price;
  31.  
     
  32.  
    public Computer() {
  33.  
    super();
  34.  
    }
  35.  
     
  36.  
    public Computer(String serialNumber, String brandName, Date productDate,
  37.  
    double price) {
  38.  
    super();
  39.  
    this.serialNumber = serialNumber;
  40.  
    this.brandName = brandName;
  41.  
    this.productDate = productDate;
  42.  
    this.price = price;
  43.  
    }
  44.  
     
  45.  
    public String getSerialNumber() {
  46.  
    return serialNumber;
  47.  
    }
  48.  
     
  49.  
    public void setSerialNumber(String serialNumber) {
  50.  
    this.serialNumber = serialNumber;
  51.  
    }
  52.  
     
  53.  
    public String getBrandName() {
  54.  
    return brandName;
  55.  
    }
  56.  
     
  57.  
    public void setBrandName(String brandName) {
  58.  
    this.brandName = brandName;
  59.  
    }
  60.  
     
  61.  
    public Date getProductDate() {
  62.  
    return productDate;
  63.  
    }
  64.  
     
  65.  
    public void setProductDate(Date productDate) {
  66.  
    this.productDate = productDate;
  67.  
    }
  68.  
     
  69.  
    public double getPrice() {
  70.  
    return price;
  71.  
    }
  72.  
     
  73.  
    public void setPrice(double price) {
  74.  
    this.price = price;
  75.  
    }
  76.  
     
  77.  
    }

此時的User.java內容以下:

  1.  
    package com.xml;
  2.  
     
  3.  
    import java.io.Serializable;
  4.  
    import java.util.Date;
  5.  
    import java.util.List;
  6.  
     
  7.  
    import javax.xml.bind.annotation.XmlAccessType;
  8.  
    import javax.xml.bind.annotation.XmlAccessorType;
  9.  
    import javax.xml.bind.annotation.XmlRootElement;
  10.  
    import javax.xml.bind.annotation.XmlType;
  11.  
     
  12.  
    /**
  13.  
    *
  14.  
    * @author Steven
  15.  
    *
  16.  
    */
  17.  
    @XmlAccessorType(XmlAccessType.FIELD)
  18.  
    // XML文件中的根標識
  19.  
    @XmlRootElement(name = "User")
  20.  
    // 控制JAXB 綁定類中屬性和字段的排序
  21.  
    @XmlType(propOrder = {
  22.  
    "userId",
  23.  
    "userName",
  24.  
    "password",
  25.  
    "birthday",
  26.  
    "money",
  27.  
    "computers"
  28.  
    })
  29.  
    public class User implements Serializable {
  30.  
    private static final long serialVersionUID = 1L;
  31.  
     
  32.  
    // 用戶Id
  33.  
    private int userId;
  34.  
    // 用戶名
  35.  
    private String userName;
  36.  
    // 用戶密碼
  37.  
    private String password;
  38.  
    // 用戶生日
  39.  
    private Date birthday;
  40.  
    // 用戶錢包
  41.  
    private double money;
  42.  
    // 擁有的電腦
  43.  
    private List<Computer> computers;
  44.  
     
  45.  
    public User() {
  46.  
    super();
  47.  
    }
  48.  
     
  49.  
    public User(int userId, String userName, String password, Date birthday,
  50.  
    double money) {
  51.  
    super();
  52.  
    this.userId = userId;
  53.  
    this.userName = userName;
  54.  
    this.password = password;
  55.  
    this.birthday = birthday;
  56.  
    this.money = money;
  57.  
    }
  58.  
     
  59.  
    public int getUserId() {
  60.  
    return userId;
  61.  
    }
  62.  
     
  63.  
    public void setUserId(int userId) {
  64.  
    this.userId = userId;
  65.  
    }
  66.  
     
  67.  
    public String getUserName() {
  68.  
    return userName;
  69.  
    }
  70.  
     
  71.  
    public void setUserName(String userName) {
  72.  
    this.userName = userName;
  73.  
    }
  74.  
     
  75.  
    public String getPassword() {
  76.  
    return password;
  77.  
    }
  78.  
     
  79.  
    public void setPassword(String password) {
  80.  
    this.password = password;
  81.  
    }
  82.  
     
  83.  
    public Date getBirthday() {
  84.  
    return birthday;
  85.  
    }
  86.  
     
  87.  
    public void setBirthday(Date birthday) {
  88.  
    this.birthday = birthday;
  89.  
    }
  90.  
     
  91.  
    public double getMoney() {
  92.  
    return money;
  93.  
    }
  94.  
     
  95.  
    public void setMoney(double money) {
  96.  
    this.money = money;
  97.  
    }
  98.  
     
  99.  
     
  100.  
    public void setComputers(List<Computer> computers) {
  101.  
    this.computers = computers;
  102.  
    }
  103.  
     
  104.  
    public List<Computer> getComputers() {
  105.  
    return computers;
  106.  
    }
  107.  
     
  108.  
    @Override
  109.  
    public String toString() {
  110.  
    return "User [birthday=" + birthday + ", computers=" + computers
  111.  
    + ", money=" + money + ", password=" + password + ", userId="
  112.  
    + userId + ", userName=" + userName + "]";
  113.  
    }
  114.  
     
  115.  
    }

此時測試類爲

Test.java

  1.  
    package com.xml;
  2.  
     
  3.  
    import java.util.ArrayList;
  4.  
    import java.util.Date;
  5.  
    import java.util.List;
  6.  
     
  7.  
    /**
  8.  
    *
  9.  
    * @author Steven
  10.  
    *
  11.  
    */
  12.  
    public class Test {
  13.  
    public static void main(String[] args) {
  14.  
    User user = new User(1, "Steven", "@sun123", new Date(), 1000.0);
  15.  
    List<Computer> list = new ArrayList<Computer>();
  16.  
    list. add(new Computer("xxxMMeedd", "asus", new Date(), 4455.5));
  17.  
    list. add(new Computer("lenvoXx", "lenvo", new Date(), 4999));
  18.  
    user.setComputers(list);
  19.  
    String path = "D:\\user.xml";
  20.  
    System. out.println("---將對象轉換成File類型的xml Start---");
  21.  
    XMLUtil.convertToXml(user, path);
  22.  
    System. out.println("---將對象轉換成File類型的xml End---");
  23.  
    System. out.println();
  24.  
    System. out.println("---將File類型的xml轉換成對象 Start---");
  25.  
    User user2 = (User) XMLUtil.convertXmlFileToObject(User.class, path);
  26.  
    System. out.println(user2);
  27.  
    System. out.println("---將File類型的xml轉換成對象 End---");
  28.  
     
  29.  
    }
  30.  
    }

在這裏僅僅測試File類型的轉換,其結果以下所示:

產生的user.xml文件:

  1.  
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2.  
    <User>
  3.  
    <userId>1</userId>
  4.  
    <userName>Steven</userName>
  5.  
    <password>@sun123</password>
  6.  
    <birthday>2013-12-13T18:36:08.508+08:00</birthday>
  7.  
    <money>1000.0</money>
  8.  
    <computers>
  9.  
    <serialNumber>xxxMMeedd</serialNumber>
  10.  
    <brandName>asus</brandName>
  11.  
    <productDate>2013-12-13T18:36:08.508+08:00</productDate>
  12.  
    <price>4455.5</price>
  13.  
    </computers>
  14.  
    <computers>
  15.  
    <serialNumber>lenvoXx</serialNumber>
  16.  
    <brandName>lenvo</brandName>
  17.  
    <productDate>2013-12-13T18:36:08.508+08:00</productDate>
  18.  
    <price>4999.0</price>
  19.  
    </computers>
  20.  
    </User>

這裏就能夠看出一個模塊中有着另一個模塊,在項目中能夠經過此種思想不斷延伸,能夠進行不少數據的暫存,能夠起到緩存的目的。代碼寫完一遍,你們應該有着本身的思路,這樣的話,在項目中能夠根據具體的狀況具體的分析了。

 

Unmarshaller 類使客戶端應用程序可以將 XML 數據轉換爲 Java 內容對象樹。

備註:marshal(序列化、排列、整理)

Marshaller 類使客戶端應用程序可以將 Java 內容樹轉換回 XML 數據。

  1.  
    package hb.jaxb;
  2.  
     
  3.  
    public class Classroom {
  4.  
    private int id;
  5.  
    private String name;
  6.  
    private int grade;
  7.  
     
  8.  
    public int getId() {
  9.  
    return id;
  10.  
    }
  11.  
     
  12.  
    public void setId(int id) {
  13.  
    this.id = id;
  14.  
    }
  15.  
     
  16.  
    public String getName() {
  17.  
    return name;
  18.  
    }
  19.  
     
  20.  
    public void setName(String name) {
  21.  
    this.name = name;
  22.  
    }
  23.  
     
  24.  
    public int getGrade() {
  25.  
    return grade;
  26.  
    }
  27.  
     
  28.  
    public void setGrade(int grade) {
  29.  
    this.grade = grade;
  30.  
    }
  31.  
     
  32.  
    public Classroom(int id, String name, int grade) {
  33.  
    super();
  34.  
    this.id = id;
  35.  
    this.name = name;
  36.  
    this.grade = grade;
  37.  
    }
  38.  
     
  39.  
    public Classroom() {
  40.  
    super();
  41.  
    }
  42.  
     
  43.  
    }
  1.  
    package hb.jaxb;
  2.  
     
  3.  
    import javax.xml.bind.annotation.XmlRootElement;
  4.  
     
  5.  
    @XmlRootElement
  6.  
    public class Student {
  7.  
    private int id;
  8.  
    private String name;
  9.  
    private int age;
  10.  
    private Classroom classroom;
  11.  
     
  12.  
    public int getId() {
  13.  
    return id;
  14.  
    }
  15.  
     
  16.  
    public void setId(int id) {
  17.  
    this.id = id;
  18.  
    }
  19.  
     
  20.  
    public String getName() {
  21.  
    return name;
  22.  
    }
  23.  
     
  24.  
    public void setName(String name) {
  25.  
    this.name = name;
  26.  
    }
  27.  
     
  28.  
    public int getAge() {
  29.  
    return age;
  30.  
    }
  31.  
     
  32.  
    public void setAge(int age) {
  33.  
    this.age = age;
  34.  
    }
  35.  
     
  36.  
    public Classroom getClassroom() {
  37.  
    return classroom;
  38.  
    }
  39.  
     
  40.  
    public void setClassroom(Classroom classroom) {
  41.  
    this.classroom = classroom;
  42.  
    }
  43.  
     
  44.  
    public Student(int id, String name, int age, Classroom classroom) {
  45.  
    super();
  46.  
    this.id = id;
  47.  
    this.name = name;
  48.  
    this.age = age;
  49.  
    this.classroom = classroom;
  50.  
    }
  51.  
     
  52.  
    //無參夠着函數必定須要,不然JXBContext沒法正常解析。
  53.  
    public Student() {
  54.  
    super();
  55.  
    }
  56.  
    }

注意:

一、須要轉換的model對象必定要添加@XmlRootElement註解,其裏面的其餘對象則不須要

二、須要轉換的model對象必定要有不帶參數的構造方法,包括該對象裏面引用的對象。

  1.  
    package hb.jaxb;
  2.  
     
  3.  
    import java.io.StringReader;
  4.  
     
  5.  
    import javax.xml.bind.JAXBContext;
  6.  
    import javax.xml.bind.JAXBException;
  7.  
    import javax.xml.bind.Marshaller;
  8.  
    import javax.xml.bind.Unmarshaller;
  9.  
    import org.junit.Test;
  10.  
     
  11.  
    public class TestJaxb {
  12.  
     
  13.  
    @Test
  14.  
    public void beanToXML() {
  15.  
    Classroom classroom = new Classroom(1, "軟件工程", 4);
  16.  
    Student student = new Student(101, "張三", 22, classroom);
  17.  
     
  18.  
    try {
  19.  
    JAXBContext context = JAXBContext.newInstance(Student.class);
  20.  
    Marshaller marshaller = context.createMarshaller();
  21.  
    marshaller.marshal(student, System.out);
  22.  
    } catch (JAXBException e) {
  23.  
    e.printStackTrace();
  24.  
    }
  25.  
     
  26.  
    }
  27.  
     
  28.  
    @Test
  29.  
    public void XMLStringToBean(){
  30.  
    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>";
  31.  
    try {
  32.  
    JAXBContext context = JAXBContext.newInstance(Student.class);
  33.  
    Unmarshaller unmarshaller = context.createUnmarshaller();
  34.  
    Student student = (Student)unmarshaller.unmarshal( new StringReader(xmlStr));
  35.  
    System.out.println(student.getAge());
  36.  
    System.out.println(student.getClassroom().getName());
  37.  
    } catch (JAXBException e) {
  38.  
    e.printStackTrace();
  39.  
    }
  40.  
     
  41.  
    }
  42.  
    }

JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項能夠根據XML Schema產生Java類的技術。該過程當中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,並能將Java對象樹的內容從新寫到XML實例文檔。從另外一方面來說,JAXB提供了快速而簡便的方法將XML模式綁定到Java表示,從而使得Java開發者在Java應用程序中能方便地結合XML數據和處理函數。

 

    JAXBContext 類提供到 JAXB API 的客戶端入口點。它提供了管理實現 JAXB 綁定框架操做所需的 XML/Java 綁定信息的抽象,這些操做包括:解組、編組和驗證。

相關文章
相關標籤/搜索