使用JAXB實現JAVA物件和XML字串的互相轉換
阿新 • • 發佈:2019-02-16
測試類:
package com.solin.test; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { Student student = new Student(); student.setName("邪惡小法師"); student.setAge("110"); student.setSex("男"); List<Student.Friend> list = new ArrayList<>(); Student.Friend f1 = new Student.Friend(); f1.setName("德瑪西亞之力"); f1.setAge("888"); f1.setSex("男"); Student.Friend f2 = new Student.Friend(); f2.setName("無雙劍姬"); f2.setAge("898"); f2.setSex("女"); list.add(f1); list.add(f2); student.setFriend(list); //將java物件轉換為XML字串 String xmlStr = XmlAndJavaObjectConvert.convertToXml(student); System.out.println(xmlStr); //將xml字串轉換為java物件 System.out.println(XmlAndJavaObjectConvert.convertXmlStrToObject(Student.class, xmlStr)); } }
實體類:
package com.solin.test; import java.util.List; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; //XML檔案中的根標識 @XmlRootElement(name = "Student") //控制JAXB 繫結類中屬性和欄位的排序 @XmlType(propOrder = { "name", "age", "sex", "friend" }) public class Student { private String name; private String age; private String sex; private List<Friend> friend; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @XmlElementWrapper(name="friendList") public List<Friend> getFriend() { return friend; } public void setFriend(List<Friend> friend) { this.friend = friend; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", friendList=" + friend + "]"; } public static class Friend{ private String name; private String age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Friend [name=" + name + ", age=" + age + ", sex=" + sex + "]"; } } }
工具類:
package com.solin.test; 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 class XmlAndJavaObjectConvert { /** * 將物件直接轉換成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(); } /** * 將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; } }
輸出結果如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Student>
<name>邪惡小法師</name>
<age>110</age>
<sex>男</sex>
<friendList>
<friend>
<age>888</age>
<name>德瑪西亞之力</name>
<sex>男</sex>
</friend>
<friend>
<age>898</age>
<name>無雙劍姬</name>
<sex>女</sex>
</friend>
</friendList>
</Student>
Student [name=邪惡小法師, age=110, sex=男, friendList=[Friend [name=德瑪西亞之力, age=888, sex=男], Friend [name=無雙劍姬, age=898, sex=女]]]