天天看點

JAXB實作XML與Java對象的轉化1. JAXB介紹2. JDK中JAXB相關的重要Class和Interface3. JDK中JAXB相關的重要Annotation4. Java對象和XML檔案互相操作的核心代碼XMLUtil.java

1. JAXB介紹

JAXB是一項可以根據XML Schema産生Java類的技術。該過程中,JAXB也提供了将XML執行個體文檔反向生成java對象樹的方法,并能将Java對象樹的内容重新寫到XML執行個體文檔。從另外一個方面講,JAXB提供了快速而簡便的方法将XML模式綁定到java表示。

2. JDK中JAXB相關的重要Class和Interface

  1. JAXBContext類,是應用的入口,用于管理XML/Java綁定資訊;
  2. Marshaller接口,将Java對象序列化成XML對象;
  3. Unmarshaller接口,将XML資料反序列化為Java對象。

3. JDK中JAXB相關的重要Annotation

  1. @XmlType,将Java類或枚舉類型映射到XML模式類型;
  2. @XmlAccessorType(XmlAccessType.FIELD) ,控制字段或屬性的序列化。FIELD表示JAXB将自動綁定Java類中的每個非靜态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值還有XmlAccessType.PROPERTY和XmlAccessType.NONE。
  3. @XmlRootElement,将Java類或枚舉類型映射到XML元素。
  4. @XmlElement,将Java類的一個屬性映射到與屬性同名的一個XML元素。
  5. @XmlAttribute,将Java類的一個屬性映射到與屬性同名的一個XML屬性。

4. Java對象和XML檔案互相操作的核心代碼XMLUtil.java

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;  
    }  
}