Java操作XML的工具:JAXB
JavaArchitecture 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(javaArchitecture 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;
} @Override
public 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;
} @Override
public 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);
}
}
}
四、运行效果

Java操作XML的工具:JAXB的更多相关文章
- Java操作XML的工具类
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inp ...
- Java操作XML的JAXB工具
在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上 ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
- 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!
转载自:https://github.com/whvcse/RedisUtil 代码 ProtoStuffSerializerUtil.java import java.io.ByteArrayInp ...
- 用java操作XML文件(DOM解析方式)
XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...
- Java操作xml文件
Bbsxml.java public class Bbsxml { private String imgsrc; private String title; private String url; p ...
- Java操作字符串的工具类
操作字符串的工具类 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStre ...
- Java操作图片的工具类
操作图片的工具类: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.a ...
- Java操作XML文件 dom4j 篇
在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互.今天就来讲一下Java 中使用dom4j来操作XML文件. 我们需要引入的包: //文件包 import java.io. ...
随机推荐
- 学习 FPGA之前的基础知识
在学习一门技术之前往往应该从它的编程语言入手,比如学习单片机时,往往从汇编或者C语言入门.所以不少开始接触FPGA的开发人员,往往是从VHDL或者Verilog开始入手学习的.但小编认为,若能先结合& ...
- appium+python自动化28-name定位
前言 appium1.5以下老的版本是可以通过name定位的,新版本从1.5以后都不支持name定位了 name定位报错 1.最新版appium V1.7用name定位,报错: selenium.co ...
- HDU 2669 Romantic(裸的拓展欧几里得)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- nginx上传文件大小
采用nginx作反向代理,出现了一个诡异的问题,小文件可以提交,大文件会报500内部错误.这个是什么原因导致的呢? 查wiki可知,上传文件大小相关的有三个配置 client_body_buffer_ ...
- css 定位position总结
在CSS中,Position 属性经常会用到,主要是绝对定位和相对定位,简单的使用都没有问题,尤其嵌套起来,就会有些混乱,今记录总结一下,防止久而忘之. CSS position 属性值: absol ...
- 【BZOJ】1878: [SDOI2009]HH的项链 (主席树)
题目 传送门:QWQ 分析 莫队也能做,但我想练练主席树. 求k-th一样维护第i个时候的线段树,线段树来维护区间不同数. 然后查询时可以通过上下界小优化一波. 但是我的代码丑陋无比,常数巨大(捂脸 ...
- 线程之死锁、递归锁、信号量、事件Event 、定时器
1.死锁的现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相 ...
- C语言和C++中的字符串(string)
知识内容: 1.C\C++字符串简述 2.C字符串相关操作 3.C++ string类相关操作 一.C\C++字符串简述 1.C语言字符串 C语言字符串是字符的数组.单字节字符串顺序存放各个字符串,并 ...
- 【转】 UML各种线的含义
原文地址:http://blog.csdn.net/jianfpeng241241/article/details/49617449 内容目录: 从一个示例开始 类之间的关系 时序图 附录:<图 ...
- 跟我学算法-Logistic回归
虽然Logistic回归叫回归,但是其实它是一个二分类或者多分类问题 这里的话我们使用信用诈骗的数据进行分析 第一步:导入数据,Amount的数值较大,后续将进行(-1,1)的归一化 data = p ...