1. 程式人生 > >JavaBean類與XML的互換----jdk自帶的JAXBContext

JavaBean類與XML的互換----jdk自帶的JAXBContext

一、簡介

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 繫結資訊的抽象,這些操作包括:解組、編組和驗證。 二、重要的類和介面

JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。
Marshaller介面,將Java物件序列化為XML資料
Unmarshaller介面,將XML資料反序列化為Java物件。

三、JDK中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屬性。

四、JavaBean與XML字串互轉例項

//******************************基礎類
@Data
@XmlRootElement
public class Group {

    private String groupName;

    private List<User> userList = new ArrayList<User>();
}
@Data
public class User {

    private String name;

    private Date birthDay;

    private Integer age;

}

//********************************XML工具類
public class XmlUtils {
    /**
     * 功能描述:例項化JAXBContext物件,每種型別只例項化一次。 因為 JAXBContext.newInstance()方法在併發量高時有效能問題。
     */
    public static ConcurrentHashMap<Class<?> , JAXBContext> map = new ConcurrentHashMap<Class<?> , JAXBContext>() ;

    /**
     * 功能描述:獲取JAXBContext例項
     */
    public static JAXBContext getInstance(Class<?> cla){
        try {
            if(map.contains(cla)){
                return map.get(cla);
            }else{
                JAXBContext jaxbContext = JAXBContext.newInstance(cla);
                map.put(cla , jaxbContext);
                return jaxbContext;
            }
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 功能描述:序列化---JavaBean 轉 Xml字串
     */
    public static String marshal(Object obj){
        String xmlStr = "";
        try {
            JAXBContext jaxbContext = getInstance(obj.getClass());
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);//格式化輸出xml
            //marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 是否省略xml頭資訊
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");//設定編碼格式
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj , new StreamResult(writer));
            xmlStr = writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlStr.toString();
    }

    /**
     * 功能描述:反序列化---Xml字串 轉 JavaBean
     */
    public static <T> T unmarshal(String xmlStr , Class<T> cla){
        try {
            JAXBContext jaxbContext = getInstance(cla);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            return (T) unmarshaller.unmarshal(new StringReader(xmlStr));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return null;
    }
}

//********************************測試類
public class XMLTest1 {

    public Group init(){
        ArrayList<User> users = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            User user = new User();
            user.setName("zhangsan"+i);
            user.setAge(10+i);
            user.setBirthDay(new Date());
            users.add(user);
        }
        Group group = new Group();
        group.setGroupName("1組");
        group.setUserList(users);
        return group;
    }

    //JavaBean轉XML字串
    @Test
    public void JavaBean2XML() throws JAXBException {
        Group goup = init();
        String xmlStr = XmlUtils.marshal(goup);
        System.out.println(xmlStr);
    }
    /**結果:
     <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
     <group>
         <groupName>1組</groupName>
         <userList>
             <age>10</age>
             <birthDay>2018-11-07T16:21:20.558+08:00</birthDay>
             <name>zhangsan0</name>
        </userList>
        <userList>
            <age>11</age>
            <birthDay>2018-11-07T16:21:20.558+08:00</birthDay>
            <name>zhangsan1</name>
        </userList>
    </group>
     */

    //XML字串轉JavaBean
    @Test
    public void XML2JavaBean() throws JAXBException {
        Group group = init();
        String xmlStr = XmlUtils.marshal(group);
        Group group2 = XmlUtils.unmarshal(xmlStr, Group.class);
        System.out.println(group2);
    }
    /**結果:
    *Group(groupName=1組, userList=[User(name=zhangsan0, birthDay=Wed Nov 07 16:23:22 CST 2018, age=10), User(name=zhangsan1, birthDay=Wed Nov 07 16:23:22 CST 2018, age=11)])
    /
}