1. 程式人生 > >JAXB 實現Java和xml的互相轉換

JAXB 實現Java和xml的互相轉換

下面是 轉於 : https://blog.csdn.net/qq383264679/article/details/52231128           感謝博主

首先介紹下什麼是JAXB?

JAXB(Java Architecture for XML Binding) 是一項可以根據XML Schema產生Java類的技術。 該過程中,JAXB也提供了將XML例項文件反向生成Java物件樹的方法,並能將Java物件樹的內容重新寫到 XML例項文件。Jaxb 2.0是JDK 1.6的組成部分。我們不需要下載第三方jar包 即可做到輕鬆轉換。

JAXB的核心類有如下三個:

       JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。

       該類不能直接建立,只能使用如下方式進行例項化JAXBContext物件:

 

  Marshaller介面,將Java物件序列化為XML資料。

                  該類是設定轉換為XML資料的熟悉如格式化輸出xml,裝置xml的編碼格式等:

                  Marshaller marshaller = context.createMarshaller();  
                  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
                  marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);  
                  marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);

 

  Unmarshaller介面,將XML資料反序列化為Java物件。

                  反序列化java物件需要用到的例項:

                  Unmarshaller unmarshaller = context.createUnmarshaller();  
                   t = (T) unmarshaller.unmarshal(new StringReader(xml));

使用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屬性。

下面是轉於博主: https://blog.csdn.net/y534560449/article/details/73250062


@XmlRootElement  
public class Man {  
    private String name;  
    private int age;  
	
    public Student() {  
        super();  
    } 
    public Student(String name, int age) {  
        super();  
        this.name = name;  
        this.age = age;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }   
}  

Java 轉換 Xml:

@Test  
public void testJava2Xml(){  
    try {  
        JAXBContext jc = JAXBContext.newInstance(Man.class);  
        Marshaller ms = jc.createMarshaller();  
        Man man = new Man("man",100);  
        ms.marshal(man, System.out);  
    } catch (JAXBException e) {  
        e.printStackTrace();  
    }  
}  

Xml 轉換 Java:

@Test  
public void testXml2Java() throws JAXBException{  
    String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Man><age>100</age><name>man</name></Man>";  
    JAXBContext jc = JAXBContext.newInstance(Man.class);  
    Unmarshaller unmar = jc.createUnmarshaller();  
    Man man = (Man) unmar.unmarshal(new StringReader(xml));  
    System.out.println(man.getName());  
} 

 

下面是原創:(將Java 轉成 XML)

 

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, true);
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, 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;  
    }  
    
    public static void main(String[] args) {
    	List<Staff> staffs = new ArrayList<Staff>();  
        
        Staff stf = new Staff();  
        stf.setName("周星馳");  
        stf.setAge(40);  
        stf.setSmoker(true);  
        staffs.add(stf);  
        
        Staff stf1 = new Staff();  
         
        stf1.setAge(40);  
        stf1.setSmoker(true);  
        staffs.add(stf1);  
        
        Department dept = new Department();  
        dept.setName("娛樂圈");  
        dept.setStaffs(staffs);  
        
        
       System.out.println(new XmlUtil().convertToXml(dept)); 
        
	}
}