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
-
-
-
import java.io.Serializable;
-
-
-
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(name = "User")
-
-
-
-
-
-
-
-
-
public class User implements Serializable {
-
private static final long serialVersionUID = 1L;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
public User(int userId, String userName, String password, Date birthday,
-
-
-
-
this.userName = userName;
-
this.password = password;
-
this.birthday = birthday;
-
-
-
-
-
-
-
-
public void setUserId(int userId) {
-
-
-
-
public String getUserName() {
-
-
-
-
public void setUserName(String userName) {
-
this.userName = userName;
-
-
-
public String getPassword() {
-
-
-
-
public void setPassword(String password) {
-
this.password = password;
-
-
-
public Date getBirthday() {
-
-
-
-
public void setBirthday(Date birthday) {
-
this.birthday = birthday;
-
-
-
public double getMoney() {
-
-
-
-
public void setMoney(double money) {
-
-
-
-
-
public String toString() {
-
return "User [birthday=" + birthday + ", money=" + money
-
+
", password=" + password + ", userId=" + userId
-
+
", userName=" + userName + "]";
-
-
-
此時給出最重要的進行Java對象和XML文件相互操做的核心代碼XMLUtil.java,其中有着兩種方式進行轉換,一種是轉換成對象和string類型的xml轉換,一種是對象和xml文件進行轉換。
XMLUtil.java
-
-
-
import java.io.FileNotFoundException;
-
import java.io.FileReader;
-
import java.io.FileWriter;
-
import java.io.IOException;
-
import java.io.StringReader;
-
import java.io.StringWriter;
-
-
import javax.xml.bind.JAXBContext;
-
import javax.xml.bind.JAXBException;
-
import javax.xml.bind.Marshaller;
-
import javax.xml.bind.Unmarshaller;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
public static String convertToXml(Object obj) {
-
-
StringWriter sw =
new StringWriter();
-
-
-
JAXBContext context = JAXBContext.newInstance(obj.getClass());
-
-
Marshaller marshaller = context.createMarshaller();
-
-
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
-
-
-
marshaller.marshal(obj, sw);
-
}
catch (JAXBException e) {
-
-
-
-
-
-
-
-
-
-
-
-
-
public static void convertToXml(Object obj, String path) {
-
-
-
JAXBContext context = JAXBContext.newInstance(obj.getClass());
-
-
Marshaller marshaller = context.createMarshaller();
-
-
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
-
-
-
-
-
-
fw =
new FileWriter(path);
-
}
catch (IOException e) {
-
-
-
marshaller.marshal(obj, fw);
-
}
catch (JAXBException e) {
-
-
-
-
-
@SuppressWarnings("unchecked")
-
-
-
-
public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
-
-
-
JAXBContext context = JAXBContext.newInstance(clazz);
-
-
Unmarshaller unmarshaller = context.createUnmarshaller();
-
StringReader sr =
new StringReader(xmlStr);
-
xmlObject = unmarshaller.unmarshal(sr);
-
}
catch (JAXBException e) {
-
-
-
-
-
-
@SuppressWarnings("unchecked")
-
-
-
-
public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
-
-
-
JAXBContext context = JAXBContext.newInstance(clazz);
-
Unmarshaller unmarshaller = context.createUnmarshaller();
-
-
-
fr =
new FileReader(xmlPath);
-
}
catch (FileNotFoundException e) {
-
-
-
xmlObject = unmarshaller.unmarshal(fr);
-
}
catch (JAXBException e) {
-
-
-
-
-
下面給出測試類Test.java
-
-
-
-
-
-
-
-
-
-
-
public static void main(String[] args) {
-
-
User user =
new User(1, "Steven", "@sun123", new Date(), 1000.0);
-
System.
out.println("---將對象轉換成string類型的xml Start---");
-
-
String str = XMLUtil.convertToXml(user);
-
-
System.
out.println(str);
-
System.
out.println("---將對象轉換成string類型的xml End---");
-
-
System.
out.println("---將String類型的xml轉換成對象 Start---");
-
User userTest = (User) XMLUtil.convertXmlStrToObject(User.class, str);
-
System.
out.println(userTest);
-
System.
out.println("---將String類型的xml轉換成對象 End---");
-
-
第二種方式的測試類以下所示;
Test.java
-
-
-
-
-
-
-
-
-
-
-
public static void main(String[] args) {
-
-
User user =
new User(1, "Steven", "@sun123", new Date(), 1000.0);
-
-
String path =
"D:\\user.xml";
-
System.
out.println("---將對象轉換成File類型的xml Start---");
-
XMLUtil.convertToXml(user, path);
-
System.
out.println("---將對象轉換成File類型的xml End---");
-
-
System.
out.println("---將File類型的xml轉換成對象 Start---");
-
User user2 = (User) XMLUtil.convertXmlFileToObject(User.class, path);
-
System.
out.println(user2);
-
System.
out.println("---將File類型的xml轉換成對象 End---");
-
-
此時在D:\產生的文件如圖3所示:

此時打開user.xml,內容以下所示:
-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-
-
<userName>Steven</userName>
-
<password>@sun123</password>
-
<birthday>2013-12-13T18:24:03.477+08:00</birthday>
-
-
此時就是一個對象和XML間的相互轉換過程,可是對於實際中會有不少的狀況,在User中存在一個子模塊Computer,這時候就須要將Computer做爲User的一個屬性,此時的代碼以下所示:
Computer.java
-
-
-
import java.io.Serializable;
-
-
-
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(name = "Computer")
-
@XmlType(propOrder = { "serialNumber", "brandName", "productDate", "price" })
-
public class Computer implements Serializable {
-
private static final long serialVersionUID = 1L;
-
-
-
private String serialNumber;
-
-
private String brandName;
-
-
private Date productDate;
-
-
-
-
-
-
-
-
public Computer(String serialNumber, String brandName, Date productDate,
-
-
-
this.serialNumber = serialNumber;
-
this.brandName = brandName;
-
this.productDate = productDate;
-
-
-
-
public String getSerialNumber() {
-
-
-
-
public void setSerialNumber(String serialNumber) {
-
this.serialNumber = serialNumber;
-
-
-
public String getBrandName() {
-
-
-
-
public void setBrandName(String brandName) {
-
this.brandName = brandName;
-
-
-
public Date getProductDate() {
-
-
-
-
public void setProductDate(Date productDate) {
-
this.productDate = productDate;
-
-
-
public double getPrice() {
-
-
-
-
public void setPrice(double price) {
-
-
-
-
此時的User.java內容以下:
-
-
-
import java.io.Serializable;
-
-
-
-
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(name = "User")
-
-
-
-
-
-
-
-
-
-
public class User implements Serializable {
-
private static final long serialVersionUID = 1L;
-
-
-
-
-
-
-
-
-
-
-
-
-
private List<Computer> computers;
-
-
-
-
-
-
public User(int userId, String userName, String password, Date birthday,
-
-
-
-
this.userName = userName;
-
this.password = password;
-
this.birthday = birthday;
-
-
-
-
-
-
-
-
public void setUserId(int userId) {
-
-
-
-
public String getUserName() {
-
-
-
-
public void setUserName(String userName) {
-
this.userName = userName;
-
-
-
public String getPassword() {
-
-
-
-
public void setPassword(String password) {
-
this.password = password;
-
-
-
public Date getBirthday() {
-
-
-
-
public void setBirthday(Date birthday) {
-
this.birthday = birthday;
-
-
-
public double getMoney() {
-
-
-
-
public void setMoney(double money) {
-
-
-
-
-
public void setComputers(List<Computer> computers) {
-
this.computers = computers;
-
-
-
public List<Computer> getComputers() {
-
-
-
-
-
public String toString() {
-
return "User [birthday=" + birthday + ", computers=" + computers
-
+
", money=" + money + ", password=" + password + ", userId="
-
+ userId +
", userName=" + userName + "]";
-
-
-
此時測試類爲
Test.java
-
-
-
import java.util.ArrayList;
-
-
-
-
-
-
-
-
-
-
public static void main(String[] args) {
-
User user =
new User(1, "Steven", "@sun123", new Date(), 1000.0);
-
List<Computer> list =
new ArrayList<Computer>();
-
list.
add(new Computer("xxxMMeedd", "asus", new Date(), 4455.5));
-
list.
add(new Computer("lenvoXx", "lenvo", new Date(), 4999));
-
-
String path =
"D:\\user.xml";
-
System.
out.println("---將對象轉換成File類型的xml Start---");
-
XMLUtil.convertToXml(user, path);
-
System.
out.println("---將對象轉換成File類型的xml End---");
-
-
System.
out.println("---將File類型的xml轉換成對象 Start---");
-
User user2 = (User) XMLUtil.convertXmlFileToObject(User.class, path);
-
System.
out.println(user2);
-
System.
out.println("---將File類型的xml轉換成對象 End---");
-
-
-
在這裏僅僅測試File類型的轉換,其結果以下所示:
產生的user.xml文件:
-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-
-
<userName>Steven</userName>
-
<password>@sun123</password>
-
<birthday>2013-12-13T18:36:08.508+08:00</birthday>
-
-
-
<serialNumber>xxxMMeedd</serialNumber>
-
<brandName>asus</brandName>
-
<productDate>2013-12-13T18:36:08.508+08:00</productDate>
-
-
-
-
<serialNumber>lenvoXx</serialNumber>
-
<brandName>lenvo</brandName>
-
<productDate>2013-12-13T18:36:08.508+08:00</productDate>
-
-
-
這裏就能夠看出一個模塊中有着另一個模塊,在項目中能夠經過此種思想不斷延伸,能夠進行不少數據的暫存,能夠起到緩存的目的。代碼寫完一遍,你們應該有着本身的思路,這樣的話,在項目中能夠根據具體的狀況具體的分析了。
Unmarshaller 類使客戶端應用程序可以將 XML 數據轉換爲 Java 內容對象樹。
備註:marshal(序列化、排列、整理)
Marshaller 類使客戶端應用程序可以將 Java 內容樹轉換回 XML 數據。
-
-
-
-
-
-
-
-
-
-
-
-
public void setId(int id) {
-
-
-
-
public String getName() {
-
-
-
-
public void setName(String name) {
-
-
-
-
-
-
-
-
public void setGrade(int grade) {
-
-
-
-
public Classroom(int id, String name, int grade) {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
import javax.xml.bind.annotation.XmlRootElement;
-
-
-
-
-
-
-
private Classroom classroom;
-
-
-
-
-
-
public void setId(int id) {
-
-
-
-
public String getName() {
-
-
-
-
public void setName(String name) {
-
-
-
-
-
-
-
-
public void setAge(int age) {
-
-
-
-
public Classroom getClassroom() {
-
-
-
-
public void setClassroom(Classroom classroom) {
-
this.classroom = classroom;
-
-
-
public Student(int id, String name, int age, Classroom classroom) {
-
-
-
-
-
this.classroom = classroom;
-
-
-
-
-
-
-
注意:
一、須要轉換的model對象必定要添加@XmlRootElement註解,其裏面的其餘對象則不須要
二、須要轉換的model對象必定要有不帶參數的構造方法,包括該對象裏面引用的對象。
-
-
-
import java.io.StringReader;
-
-
import javax.xml.bind.JAXBContext;
-
import javax.xml.bind.JAXBException;
-
import javax.xml.bind.Marshaller;
-
import javax.xml.bind.Unmarshaller;
-
-
-
-
-
-
public void beanToXML() {
-
Classroom classroom =
new Classroom(1, "軟件工程", 4);
-
Student student =
new Student(101, "張三", 22, classroom);
-
-
-
JAXBContext context = JAXBContext.newInstance(Student.class);
-
Marshaller marshaller = context.createMarshaller();
-
marshaller.marshal(student, System.out);
-
}
catch (JAXBException e) {
-
-
-
-
-
-
-
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>";
-
-
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) {
-
-
-
-
-
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 綁定信息的抽象,這些操做包括:解組、編組和驗證。