版權全部,轉載請註明出處html
基於JAXB2 的xml bean 轉換工具java
JDK,Dom4japi
/** * 基於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>
@XmlType @XmlElement @XmlRootElement @XmlAttribute @XmlAccessorType @XmlAccessorOrder @XmlTransient @XmlJavaTypeAdapter
@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);
對我來講,使用JDK的XML解析類很不方便.爲了解決複雜的XML Bean組合與拆分問題,我一般使用Dom4j提取出Bean對應的DOM元素節點,而後再用JAXB解析爲Bean實例.測試
反過來,多個Bean組合的XML文檔,先使用JAXB將Bean轉爲XML,在使用Dom4j組合這些XML.this
Dom4j很方便的一點就是可使用XPath直接,準確的定位元素節點..net