Java操作XML的工具:JAXB
Java?Architecture for XML Binding (JAXB)?是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,并能將Java對象樹的內容重新寫到XML實例文檔。從另一方面來講,JAXB提供了快速而簡便的方法將XML模式綁定到Java表示,從而使得Java開發者在Java應用程序中能方便地結合XML數據和處理函數。
這意味著你不需要處理甚至不需要知道XML編程技巧就能在Java應用程序中利用平臺核心XML數據的靈活性。而且,可以充分利用XML的優勢而不用依賴于復雜的XML處理模型如SAX或DOM。JAXB?隱藏了細節并且取消了SAX和DOM中沒用的關系——生成的JAXB類僅描述原始模型中定義的關系。其結果是結合了高度可移植Java代碼和高度可移植的XML數據。其中這些代碼可用來創建靈活、輕便的應用程序和Web服務。? ? ?JAXB(java?Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,并能將Java對象樹的內容重新寫到 XML實例文檔。? Jaxb 2.0是JDK 1.6的組成部分。我們不需要下載第三方jar包 即可做到輕松轉換。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即將轉換的JavaBean中添加annotation注解。
?
一、重要概念
- JAXBContext類,是應用的入口,用于管理XML/Java綁定信息。
- Marshaller接口,將Java對象序列化為XML數據。
- Unmarshaller接口,將XML數據反序列化為Java對象。
- @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屬性。
二、工具類
package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;import org.apache.poi.ss.formula.functions.T;import javax.xml.bind.*; import javax.xml.namespace.QName; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter;public class JAXBUtil {/*** beanToXml* @param obj* @param encoding* @return*/public static String toXml(Object obj,String encoding) {try {StringWriter sw = new StringWriter();JAXBContext context = JAXBCache.instance().getJAXBContext(obj.getClass());Marshaller marshaller = context.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 是否省略xm頭聲明信息marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);marshaller.marshal(obj, sw);return sw.toString().replace("ns2:","").replace(":ns2","");} catch(JAXBException e) {e.printStackTrace();return e.getMessage();}}/*** xmlToBean* @param xml* @param c* @param <T>* @return*/@SuppressWarnings("unchecked")public static <T> T toBean(String xml, Class<T> c,String encoding) {T t = null;try {JAXBContext context = JAXBContext.newInstance(c);Unmarshaller unmarshaller = context.createUnmarshaller();t = (T) unmarshaller.unmarshal(new StringReader(xml));} catch (Exception e) {e.printStackTrace();}return t;} }package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; public final class JAXBCache {private static final JAXBCache instance = new JAXBCache();private final ConcurrentMap<String, JAXBContext> contextCache = new ConcurrentHashMap<String, JAXBContext>();private JAXBCache() {}public static JAXBCache instance() {return instance;}JAXBContext getJAXBContext(Class<?> clazz) throws JAXBException {JAXBContext context = contextCache.get(clazz.getName());if ( context == null ){context = JAXBContext.newInstance(clazz);contextCache.putIfAbsent(clazz.getName(), context);}return context;} }
package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;public class XMLNameSpace {public static final String ADMIN_PREFIX = "";public static final String ADMIN_URI = "http://WebServices.WS.JointownTech.com//"; }
package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;import com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription; import com.thoughtworks.xstream.annotations.XStreamAlias;import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType;/*** Created by wls on 2017/8/15.*/ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder= {"result","errorDesc","elecPrescription"}) public class AddPrescriptionToMes2ItemResponse { // @XStreamAlias("result")@XmlElement(name="result",namespace = XMLNameSpace.ADMIN_URI)private String result;@XmlElement(required = false)private String errorDesc;@XmlElement(required = false)private ElecPrescription elecPrescription;public String getResult() {return result;}public void setResult(String result) {this.result = result;}public String getErrorDesc() {return errorDesc;}public void setErrorDesc(String errorDesc) {this.errorDesc = errorDesc;}public ElecPrescription getElecPrescription() {return elecPrescription;}public void setElecPrescription(ElecPrescription elecPrescription) {this.elecPrescription = elecPrescription;}@Overridepublic String toString() {return "AddPrescriptionToMes2ItemResponse{" +"result='" + result + '\'' +", errorDesc='" + errorDesc + '\'' +", elecPrescription=" + elecPrescription +'}';} }
package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;import com.thoughtworks.xstream.annotations.XStreamAlias;import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;/*** Created by wls on 2017/8/15.*/ //@XStreamAlias("string") @XmlRootElement(name = "string",namespace = XMLNameSpace.ADMIN_URI) @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder= {"response"}) public class AddPrescriptionToMes2Response {@XmlElement(name = "response",namespace = XMLNameSpace.ADMIN_URI)private AddPrescriptionToMes2ItemResponse response;public AddPrescriptionToMes2ItemResponse getResponse() {return response;}public void setResponse(AddPrescriptionToMes2ItemResponse response) {this.response = response;}@Overridepublic String toString() {return "AddPrescriptionToMes2Response{" +"response=" + response +'}';} }
package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;import com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription;import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType;/*** Created by wls on 2017/8/17.*/ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder= {"result","errorDesc"},namespace = XMLNameSpace.ADMIN_URI) public class SetWXPrescriptionInfoItemResponse {@XmlElement(name = "result",namespace = XMLNameSpace.ADMIN_URI)private ElecPrescription result;private String errorDesc;public ElecPrescription getResult() {return result;}public void setResult(ElecPrescription result) {this.result = result;}public String getErrorDesc() {return errorDesc;}public void setErrorDesc(String errorDesc) {this.errorDesc = errorDesc;}}
package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;import com.thoughtworks.xstream.annotations.XStreamAlias;import javax.xml.bind.annotation.*;/*** Created by wls on 2017/8/17.*/ //@XStreamAlias("string") @XmlRootElement(name = "string",namespace = XMLNameSpace.ADMIN_URI) @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder= {"response"}) public class SetWXPrescriptionInfoResponse {@XmlElement(name = "response",namespace = XMLNameSpace.ADMIN_URI)private SetWXPrescriptionInfoItemResponse response;public SetWXPrescriptionInfoItemResponse getResponse() {return response;}public void setResponse(SetWXPrescriptionInfoItemResponse response) {this.response = response;} }
三、測試類
package com.ehaoyao.jobcenter.test;import com.alibaba.fastjson.JSONObject; import com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.AddPrescriptionToMes2Response; import com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.JAXBUtil; import com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.SetWXPrescriptionInfoResponse; import com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription; import org.apache.poi.ss.formula.functions.T;import static org.junit.Assert.*;public class JaxbUtilTest {public static void main(String[] args) {ElecPrescription elecPrescription = new ElecPrescription();elecPrescription.setAddress("測試地址");elecPrescription.setAge(12);elecPrescription.setAgentNum(1);elecPrescription.setBillDates("2017-08-19 12:02:21");elecPrescription.setBlank2("1");elecPrescription.setBlank3("1");elecPrescription.setBusinessId("1435");String ret = JAXBUtil.toXml(elecPrescription,"UTF-8");System.out.println(ret);elecPrescription = (ElecPrescription) JAXBUtil.toBean(ret,ElecPrescription.class,"UTF-8");System.out.println(elecPrescription);ret = "<string xmlns=\"http://WebServices.WS.JointownTech.com//\"><response><result>1</result></response></string>";AddPrescriptionToMes2Response addPrescriptionToMes2Response = JAXBUtil.toBean(ret,AddPrescriptionToMes2Response.class,"UTF-8");System.out.println(addPrescriptionToMes2Response!=null? JSONObject.toJSONString(addPrescriptionToMes2Response):null);ret = "<string xmlns=\"http://WebServices.WS.JointownTech.com//\"><response><result><BillDates>2017-08-16</BillDates><OutPrescriptionCode>100004</OutPrescriptionCode><OutPrescriptionSn>1004</OutPrescriptionSn><tpyq>代煎</tpyq><zgyq></zgyq><Patient>張三</Patient><Gender>女</Gender><Age>12</Age><CFDates>2017-08-17</CFDates><IsPregnancy>否</IsPregnancy><cflx>外用</cflx><AgentNum>1</AgentNum><Remark></Remark><Opinion></Opinion><BusinessName>好藥師三方渠道</BusinessName><orgname>湖北公司</orgname><Dosages>1</Dosages><jyyq>1</jyyq><jyfa>微壓(密閉)解表(15min)</jyfa><PatientCode></PatientCode><PictureIP>http://10.2.72.200:131/DCIM/010100003639731150</PictureIP><GoodsDatas><GoodsData><GoodsName>炒蒺藜</GoodsName><Dosage>1</Dosage><GoodsTpyq>無</GoodsTpyq><InvoiceP>0</InvoiceP></GoodsData></GoodsDatas><LogisticsCost>0</LogisticsCost><ProcessingCost>0</ProcessingCost><cfzt>作廢</cfzt><cfjd><CFREVIEWSTAFF></CFREVIEWSTAFF><CFREVIEWTIME></CFREVIEWTIME><MIXSTAFF></MIXSTAFF><MIXREQUESTTIME></MIXREQUESTTIME><MIXSURETIME></MIXSURETIME><MIXREVIEWSTAFF></MIXREVIEWSTAFF><MIXREVIEWTIME></MIXREVIEWTIME><SOAKSTAFF></SOAKSTAFF><SOAKREQUESTTIME></SOAKREQUESTTIME><SOAKSURETIME></SOAKSURETIME><TISANESTAFF></TISANESTAFF><TISANEREQUESTTIME></TISANEREQUESTTIME><TISANESURETIME></TISANESURETIME> <OINTMENTSTAFF></OINTMENTSTAFF><OINTMENTREQUESTTIME></OINTMENTREQUESTTIME><OINTMENTSURETIME></OINTMENTSURETIME><INNERPACKINGSTAFF></INNERPACKINGSTAFF><INNERPACKINGTIME></INNERPACKINGTIME><OUTERPACKINGSTAFF>zyadmin</OUTERPACKINGSTAFF><OUTERPACKINGTIME>2017-08-16 16:41:56</OUTERPACKINGTIME></cfjd><psjd><LogisticsCompany></LogisticsCompany><ExpressNumber></ExpressNumber></psjd></result></response></string>";SetWXPrescriptionInfoResponse setWXPrescriptionInfoResponse = JAXBUtil.toBean(ret,SetWXPrescriptionInfoResponse.class,"UTF-8");System.out.println(setWXPrescriptionInfoResponse!=null? JSONObject.toJSONString(setWXPrescriptionInfoResponse):null);} } }
?
四、運行效果
?
轉載于:https://www.cnblogs.com/wlsblog/p/7452882.html
總結
以上是生活随笔為你收集整理的Java操作XML的工具:JAXB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端如何处理后端一次性传来的10w条数据
- 下一篇: 数据偏斜的处理