1. 程式人生 > >使用JAXB實現JAVA物件和XML字串的互相轉換

使用JAXB實現JAVA物件和XML字串的互相轉換

測試類:

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=女]]]