玩轉Java對象和XML相互轉換
最近在項目中一直出現Java對象和XML之間的相互轉換,一開始由於項目很龐大,我又是臨時調度過去,導致在按照項目組長的要求進行寫代碼的同時,總是在這塊雲裏霧裏,最近才慢慢開始搞清楚項目中具體的使用緣由。但是項目中封裝的代碼總是很龐大,因爲要考慮太多的東西,而對於此,我只能通過小的Demo來說明,其實在項目中用到很多插件,輕巧,靈便,封裝很好使用,但這裏我講解的是JAXB(Java Architecture for XML Binding)。
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屬性。
- package com.xml;
- import java.io.Serializable;
- import java.util.Date;
- import javax.xml.bind.annotation.XmlAccessType;
- import javax.xml.bind.annotation.XmlAccessorType;
- import javax.xml.bind.annotation.XmlRootElement;
- import javax.xml.bind.annotation.XmlType;
- /**
- *
- * @author Steven
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- // XML文件中的根標識
- @XmlRootElement(name = “User”)
- // 控制JAXB 綁定類中屬性和字段的排序
- @XmlType(propOrder = {
- ”userId”,
- ”userName”,
- ”password”,
- ”birthday”,
- ”money”,
- })
- public class User implements Serializable {
- private static final long serialVersionUID = 1L;
- // 用戶Id
- private int userId;
- // 用戶名
- private String userName;
- // 用戶密碼
- private String password;
- // 用戶生日
- private Date birthday;
- // 用戶錢包
- private double money;
- public User() {
- super();
- }
- public User(int userId, String userName, String password, Date birthday,
- double money) {
- super();
- this.userId = userId;
- this.userName = userName;
- this.password = password;
- this.birthday = birthday;
- this.money = money;
- }
- public int getUserId() {
- return userId;
- }
- public void setUserId(int userId) {
- this.userId = userId;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public double getMoney() {
- return money;
- }
- public void setMoney(double money) {
- this.money = money;
- }
- @Override
- public String toString() {
- return “User [birthday=” + birthday + “, money=” + money
- + ”, password=” + password + “, userId=” + userId
- + ”, userName=” + userName + “]”;
- }
- }
此時給出最重要的進行Java對象和XML文件相互操作的核心代碼XMLUtil.java,其中有着兩種方式進行轉換,一種是轉換成對象和string類型的xml轉換,一種是對象和xml文件進行轉換。
- package com.xml;
- 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;
- /**
- * 封裝了XML轉換成object,object轉換成XML的代碼
- *
- * @author Steven
- *
- */
- public class XMLUtil {
- /**
- * 將對象直接轉換成String類型的 XML輸出
- *
- * @param obj
- * @return
- */
- public static String convertToXml(Object obj) {
- // 創建輸出流
- StringWriter sw = new StringWriter();
- try {
- // 利用jdk中自帶的轉換類實現
- JAXBContext context = JAXBContext.newInstance(obj.getClass());
- Marshaller marshaller = context.createMarshaller();
- // 格式化xml輸出的格式
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
- Boolean.TRUE);
- // 將對象轉換成輸出流形式的xml
- marshaller.marshal(obj, sw);
- } catch (JAXBException e) {
- e.printStackTrace();
- }
- return sw.toString();
- }
- /**
- * 將對象根據路徑轉換成xml文件
- *
- * @param obj
- * @param path
- * @return
- */
- public static void convertToXml(Object obj, String path) {
- try {
- // 利用jdk中自帶的轉換類實現
- JAXBContext context = JAXBContext.newInstance(obj.getClass());
- Marshaller marshaller = context.createMarshaller();
- // 格式化xml輸出的格式
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
- Boolean.TRUE);
- // 將對象轉換成輸出流形式的xml
- // 創建輸出流
- FileWriter fw = null;
- try {
- fw = new FileWriter(path);
- } catch (IOException e) {
- e.printStackTrace();
- }
- marshaller.marshal(obj, fw);
- } catch (JAXBException e) {
- e.printStackTrace();
- }
- }
- @SuppressWarnings(“unchecked”)
- /**
- * 將String類型的xml轉換成對象
- */
- public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
- Object xmlObject = null;
- try {
- JAXBContext context = JAXBContext.newInstance(clazz);
- // 進行將Xml轉成對象的核心接口
- Unmarshaller unmarshaller = context.createUnmarshaller();
- StringReader sr = new StringReader(xmlStr);
- xmlObject = unmarshaller.unmarshal(sr);
- } catch (JAXBException e) {
- e.printStackTrace();
- }
- return xmlObject;
- }
- @SuppressWarnings(“unchecked”)
- /**
- * 將file類型的xml轉換成對象
- */
- public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
- Object xmlObject = null;
- try {
- JAXBContext context = JAXBContext.newInstance(clazz);
- Unmarshaller unmarshaller = context.createUnmarshaller();
- FileReader fr = null;
- try {
- fr = new FileReader(xmlPath);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- xmlObject = unmarshaller.unmarshal(fr);
- } catch (JAXBException e) {
- e.printStackTrace();
- }
- return xmlObject;
- }
- }
下面給出測試類Test.java
- package com.xml;
- import java.util.Date;
- /**
- *
- * @author Steven
- *
- */
- public class Test {
- public static void main(String[] args) {
- // 創建需要轉換的對象
- User user = new User(1, “Steven”, “@sun123”, new Date(), 1000.0);
- System.out.println(”—將對象轉換成string類型的xml Start—”);
- // 將對象轉換成string類型的xml
- String str = XMLUtil.convertToXml(user);
- // 輸出
- System.out.println(str);
- System.out.println(”—將對象轉換成string類型的xml End—”);
- System.out.println();
- System.out.println(”—將String類型的xml轉換成對象 Start—”);
- User userTest = (User) XMLUtil.convertXmlStrToObject(User.class, str);
- System.out.println(userTest);
- System.out.println(”—將String類型的xml轉換成對象 End—”);
- }
- }
運行的結果如圖2所示:
圖2
- package com.xml;
- import java.util.Date;
- /**
- *
- * @author Steven
- *
- */
- public class Test {
- 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();
- 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所示:
- <?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>
- <User>
- <userId>1</userId>
- <userName>Steven</userName>
- <password>@sun123</password>
- <birthday>2013-12-13T18:24:03.477+08:00</birthday>
- <money>1000.0</money>
- </User>
此時就是一個對象和XML間的相互轉換過程,但是對於實際中會有很多的情況,在User中存在一個子模塊Computer,這時候就需要將Computer作爲User的一個屬性,此時的代碼如下所示:
- package com.xml;
- import java.io.Serializable;
- import java.util.Date;
- import javax.xml.bind.annotation.XmlAccessType;
- import javax.xml.bind.annotation.XmlAccessorType;
- import javax.xml.bind.annotation.XmlRootElement;
- import javax.xml.bind.annotation.XmlType;
- /**
- * 電腦類
- *
- * @author Steven
- *
- */
- @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;
- // 價格
- private double price;
- public Computer() {
- super();
- }
- public Computer(String serialNumber, String brandName, Date productDate,
- double price) {
- super();
- this.serialNumber = serialNumber;
- this.brandName = brandName;
- this.productDate = productDate;
- this.price = price;
- }
- public String getSerialNumber() {
- return serialNumber;
- }
- public void setSerialNumber(String serialNumber) {
- this.serialNumber = serialNumber;
- }
- public String getBrandName() {
- return brandName;
- }
- public void setBrandName(String brandName) {
- this.brandName = brandName;
- }
- public Date getProductDate() {
- return productDate;
- }
- public void setProductDate(Date productDate) {
- this.productDate = productDate;
- }
- public double getPrice() {
- return price;
- }
- public void setPrice(double price) {
- this.price = price;
- }
- }
此時的User.java內容如下:
- package com.xml;
- import java.io.Serializable;
- import java.util.Date;
- import java.util.List;
- import javax.xml.bind.annotation.XmlAccessType;
- import javax.xml.bind.annotation.XmlAccessorType;
- import javax.xml.bind.annotation.XmlRootElement;
- import javax.xml.bind.annotation.XmlType;
- /**
- *
- * @author Steven
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- // XML文件中的根標識
- @XmlRootElement(name = “User”)
- // 控制JAXB 綁定類中屬性和字段的排序
- @XmlType(propOrder = {
- ”userId”,
- ”userName”,
- ”password”,
- ”birthday”,
- ”money”,
- ”computers”
- })
- public class User implements Serializable {
- private static final long serialVersionUID = 1L;
- // 用戶Id
- private int userId;
- // 用戶名
- private String userName;
- // 用戶密碼
- private String password;
- // 用戶生日
- private Date birthday;
- // 用戶錢包
- private double money;
- // 擁有的電腦
- private List<Computer> computers;
- public User() {
- super();
- }
- public User(int userId, String userName, String password, Date birthday,
- double money) {
- super();
- this.userId = userId;
- this.userName = userName;
- this.password = password;
- this.birthday = birthday;
- this.money = money;
- }
- public int getUserId() {
- return userId;
- }
- public void setUserId(int userId) {
- this.userId = userId;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public double getMoney() {
- return money;
- }
- public void setMoney(double money) {
- this.money = money;
- }
- public void setComputers(List<Computer> computers) {
- this.computers = computers;
- }
- public List<Computer> getComputers() {
- return computers;
- }
- @Override
- public String toString() {
- return “User [birthday=” + birthday + “, computers=” + computers
- + ”, money=” + money + “, password=” + password + “, userId=”
- + userId + ”, userName=” + userName + “]”;
- }
- }
此時測試類爲
- package com.xml;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- /**
- *
- * @author Steven
- *
- */
- public class Test {
- 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));
- user.setComputers(list);
- String path = ”D:\\user.xml”;
- System.out.println(”—將對象轉換成File類型的xml Start—”);
- XMLUtil.convertToXml(user, path);
- System.out.println(”—將對象轉換成File類型的xml End—”);
- System.out.println();
- 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類型的轉換,其結果如下所示:
- <?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>
- <User>
- <userId>1</userId>
- <userName>Steven</userName>
- <password>@sun123</password>
- <birthday>2013-12-13T18:36:08.508+08:00</birthday>
- <money>1000.0</money>
- <computers>
- <serialNumber>xxxMMeedd</serialNumber>
- <brandName>asus</brandName>
- <productDate>2013-12-13T18:36:08.508+08:00</productDate>
- <price>4455.5</price>
- </computers>
- <computers>
- <serialNumber>lenvoXx</serialNumber>
- <brandName>lenvo</brandName>
- <productDate>2013-12-13T18:36:08.508+08:00</productDate>
- <price>4999.0</price>
- </computers>
- </User>
控制檯輸出信息如圖5所示爲:
<div class="t0 clearfix">
<a href="https://blog.csdn.net/zhhz418418/article/details/53080785" target="_blank" data-track-view="{"mod":"popu_642","con": ",https://blog.csdn.net/zhhz418418/article/details/53080785,"}" data-track-click="{"mod":"popu_642","con": ",https://blog.csdn.net/zhhz418418/article/details/53080785,"}">
<div class="text-content">
<h4><em>Java</em><em>對象</em>和<em>XML</em><em>相互轉換</em>(兩篇相似的但有不同的文章)</h4>
<div class="description">http://blog.csdn.net/songdeitao/article/details/17304395
最近在項目中一直出現Java對象和XML之間的相互轉換,一開始由於項目很龐大,我…
XmlAccessorType和@XmlTransient”>
JAXB的@XmlAccessorType和@XmlTransient
layman1024
05-16
2673
如果JAXB將一個類綁定到了XML,那麼默認地,所有的public成員將會被綁定。比如,公共的getter和setter方法對,或者公共的field。任何protected,package-visib…
XmlAccessorType詳解”>
@XmlAccessorType詳解
gaoqiao1988
01-08
1.1萬
@XmlAccessorType詳解
JAXB框架使得通過JAVA訪問xml變得非常簡單
例子:
@XmlRootElement
@XmlAccessorType(XmlAccessTyp…
JAXB註解的使用詳解
m765201832
07-17
1.1萬
在開始介紹jaxb註解的使用方法之前,我們先來看看具體是什麼?有什麼用?
一、 JAXB是什麼?
JAXB(即Java Architecturefor XML Binding)是一個業界的標準…
轉載 2016年01月08日
11:22:45
4456
@XmlAccessorType詳解
JAXB框架使…