JAXB 解決XML與JavaBean的互換

JAXB 解決XML與JavaBean的互換

聲明

版權全部,轉載請註明出處html

文章概要

基於JAXB2 的xml bean 轉換工具java

正文

運行環境

JDK,Dom4japi

JAXB 實現xml和javabean的編組和解組

/**
 * 基於JAXB2 的xml bean 轉換工具 
 * @author Administrator
 *
 */
public class JaxbUtil {  
  
	public static String bean2xml(Object bean){
        try {  
            JAXBContext context = JAXBContext.newInstance(bean.getClass());  
            Marshaller marshaller = context.createMarshaller();  
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            Writer writer = new StringWriter();
            marshaller.marshal(bean, writer); 
            return writer.toString();
        } catch (Exception e) {  
            e.printStackTrace();  
        }
        return null;
	}
	public static <T> T xml2Bean(String xml,Class<T> clazz){
		T t = null;  
        try { 
            JAXBContext context = JAXBContext.newInstance(clazz);  
            Unmarshaller unmarshaller = context.createUnmarshaller();  
            t = (T) unmarshaller.unmarshal(new StringReader(xml));
            return t;
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return t; 
	}
}

測試用例: JavaBean數組

@XmlAccessorType(XmlAccessType.FIELD)  
@XmlRootElement()  
@XmlType(propOrder = {}) 
public class GeneralMessageHead implements MessageHead{

	/**
	 * 
	 */
	
	private String RequestType;
	private String CompanyCode;
	private String SerialNo;
	private String TimeStamp;
	private String DataType;
	//省略getter和setter
	
	
}

測試類dom

public class JaxbUtilTest {

	@Test
	public void testBean2xml() {
		String xml = JaxbUtil.bean2xml(TestHandel.getRequestHead());
		System.out.println(xml);
	}

	@Test
	public void testXml2Bean() {
		String xml = " <generalMessageHead>     <RequestType>HisUpload</RequestType>     <CompanyCode>000000</CompanyCode>     <SerialNo>201508251502120123</SerialNo>     <TimeStamp>20150102010101</TimeStamp>     <DataType>P</DataType> </generalMessageHead>";
		GeneralMessageHead a = JaxbUtil.xml2Bean(xml, GeneralMessageHead.class);
		System.out.println(a.getCompanyCode());
		
	}

}

測試運行結果ide

000000
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<generalMessageHead>
    <RequestType>HisUpload</RequestType>
    <CompanyCode>000000</CompanyCode>
    <SerialNo>201508251502120123</SerialNo>
    <TimeStamp>20150102010101</TimeStamp>
    <DataType>P</DataType>
</generalMessageHead>

JAXB 經常使用annotation說明:

@XmlType
@XmlElement
@XmlRootElement
@XmlAttribute
@XmlAccessorType
@XmlAccessorOrder
@XmlTransient
@XmlJavaTypeAdapter

複雜Bean示例

@XmlAccessorType(XmlAccessType.FIELD)  
@XmlRootElement()  
@XmlType(propOrder = {}) 
public enum EnumBean {
	MON, TUE, WED, THU, FRI, SAT, SUN;
}

@XmlAccessorType(XmlAccessType.FIELD)  
@XmlRootElement()  
@XmlType(propOrder = {}) 
public class SimpleBean {
	private String stringType;
	private double doubleType;
	public String getStringType() {
		return stringType;
	}
	public void setStringType(String stringType) {
		this.stringType = stringType;
	}
	public double getDoubleType() {
		return doubleType;
	}
	public void setDoubleType(double doubleType) {
		this.doubleType = doubleType;
	}
}

/**
 * 該Bean包含了:
 * 引用對象
 * 基本數據類型
 * 枚舉
 * 數組
 * 集合[List,Set,Map]
 * 
 * 
 *
 */
/**
 * @XmlAccessorType用於指定由java對象生成xml文件時對java對象屬性的訪問方式,有四個枚舉值:
 * XmlAccessType.FIELD:java對象中的全部成員變量
   XmlAccessType.PROPERTY:java對象中全部經過getter/setter方式訪問的成員變量
   XmlAccessType.PUBLIC_MEMBER:java對象中全部的public訪問權限的成員變量和經過getter/setter方式訪問的成員變量
   XmlAccessType.NONE:java對象的全部(未加註解的)屬性都不映射爲xml的元素
 * 
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement()  
@XmlType(propOrder = {})
/**
@XmlAccessorOrder用於對java對象生成的xml元素進行排序.它有兩個屬性值:
XmlAccessOrder.ALPHABETICAL:對生成的xml元素按字母書序排序
XmlAccessOrder.UNDEFINED:不排序
 */
//@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class ComplexBean {
	
	@XmlElement(name="SimpleBean")//修改元素名稱
	SimpleBean otherBean;
	
	@XmlAttribute(name="intType")//使其爲根節點屬性
	int intType;
	
	@XmlTransient//忽略屬性
	long longType;
	float floatType;
	double doubleType;
	boolean booleanType;
	char charType;
	String stringType;
	
	@XmlJavaTypeAdapter(value=jaxb.FormatDate.class)//自定義轉換
	Date dateType;
	
	
	EnumBean enumType;
	
	String[] stringArrayType;
	SimpleBean[] simpleBeanArrayType;
	
	List<String> stringListType;
	Set<String> stringSetType;
	Map<String,String> stringMapType;
	
	Map<String,SimpleBean> beanMapTyep;
        //省略getter和setter
}

public class FormatDate extends XmlAdapter<String, Date> {
	private SimpleDateFormat sdf = new SimpleDateFormat("YYYY/MM/dd HH:mm:ss");
	
	@Override
	public String marshal(Date v) throws Exception {
		return sdf.format(v);
	}
	@Override
	public Date unmarshal(String v) throws Exception {
		return sdf.parse(v);
	}
}

測試代碼工具

SimpleBean simpleBean = new SimpleBean();
		simpleBean.setStringType("string");
		simpleBean.setDoubleType(1.11);
		
		ComplexBean complexBean = new ComplexBean();
		complexBean.setOtherBean(simpleBean);
		complexBean.setIntType(1);
		complexBean.setLongType(2);
		complexBean.setFloatType(3);
		complexBean.setDoubleType(4.23);
		complexBean.setCharType('5');
		complexBean.setBooleanType(true);
		complexBean.setStringType("string");
		complexBean.setDateType(new Date());
		complexBean.setEnumType(EnumBean.MON);
		
		String[] stringArrayType = new String[]{"str1","str2","str3"};
		SimpleBean[] simpleBeanArrayType = new SimpleBean[]{simpleBean};
		complexBean.setStringArrayType(stringArrayType);
		complexBean.setSimpleBeanArrayType(simpleBeanArrayType);
		
		
		List<String> stringListType = new ArrayList<String>();
		stringListType.add("list1");stringListType.add("list2");
		Set<String> stringSetType = new HashSet<String>(stringListType);
		Map<String,String> stringMapType = new HashMap<>();
		stringMapType.put("key", "value");
		complexBean.setStringListType(stringListType);
		complexBean.setStringSetType(stringSetType);
		complexBean.setStringMapType(stringMapType);
		
		Map<String,SimpleBean> beanMapTyep = new HashMap<>();
		beanMapTyep.put("key", simpleBean);
		complexBean.setBeanMapTyep(beanMapTyep);
		
		String xml = JaxbUtil.bean2xml(complexBean);
		System.out.println(xml);

使用Dom4j解析XML

對我來講,使用JDK的XML解析類很不方便.爲了解決複雜的XML Bean組合與拆分問題,我一般使用Dom4j提取出Bean對應的DOM元素節點,而後再用JAXB解析爲Bean實例.測試

反過來,多個Bean組合的XML文檔,先使用JAXB將Bean轉爲XML,在使用Dom4j組合這些XML.this

Dom4j很方便的一點就是可使用XPath直接,準確的定位元素節點..net

參考資料

JDK JAXB API
JAXB 註解
Dom4j API
Dom4j HTML Tutorials

相關文章
相關標籤/搜索