marshaller、unmarshaller解析xml及读取xml
来源:互联网 发布:kindle阅读器软件 编辑:程序博客网 时间:2024/05/24 04:09
一、简介:
本文主要介绍marshaller、unmarshaller的使用,并附上简单的实例,DOM解析和SAX解析大家应该众所周知,这里就不介绍了,自行百度或查看文档即可,marshaller简直就是神器,下面我们就来介绍一下。
首先,我们来介绍一下marshaller、unmarshaller有什么用,及API的简单介绍,JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了对XML的实例文档反向生成JAVA对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
marshaller :
从官网文档来说,marshaller 类负责管理将Java内容树序列化为XML数据的过程。简单的来说可以把java对象序列话为转为XML格式的数据。
Unmarshaller:
从官网文档来说,Unmarshaller类管理将XML数据反序列化到新创建的Java内容树中的过程,在未编组的情况下,还可以对XML数据进行验证。简单的来说。可以把XML格式的数据反序列化并且把数据绑定在Java bean的属性上。
这里我直接上案例,需要了解更多的可以移步官网文档:marshaller unmarshaller
首先创建一个ReqHeader的类:
import javax.xml.bind.annotation.XmlElement;public class ReqHeader { /** 系统编号*/ private String sysId; /** 鉴权码*/ private String authCode; /** 流水号*/ private String reqNo; public String getSysId() { return sysId; } @XmlElement(name = "SYSID") public void setSysId(String sysId) { this.sysId = sysId; } public String getAuthCode() { return authCode; } @XmlElement(name="AUTHCODE") public void setAuthCode(String authCode) { this.authCode = authCode; } public String getReqNo() { return reqNo; } @XmlElement(name="REQNO") public void setReqNo(String reqNo) { this.reqNo = reqNo; }}
然后创建一个内容类:
public class SmsBody { /** * 短信内容 */ private String content; /** * 手机号 */ private String sourceAddr; /** * 服务代码 */ private String destAddr; public String getContent() { return content; } @XmlElement(name = "CONTEXT") public void setContent(String content) { this.content = content; } public String getSourceAddr() { return sourceAddr; } @XmlElement(name = "SOURCEADDR") public void setSourceAddr(String sourceAddr) { this.sourceAddr = sourceAddr; } public String getDestAddr() { return destAddr; } @XmlElement(name="DESTADDR") public void setDestAddr(String destAddr) { this.destAddr = destAddr; }}
最后创建一个包装类:
@XmlRootElement(name = "SMSDELIVERREQ")public class SmsDeliverReq { private ReqHeader reqHeader; private List<SmsBody> smsBodys; @XmlElement(name = "REQHEADER") public ReqHeader getReqHeader() { return reqHeader; } public void setReqHeader(ReqHeader reqHeader) { this.reqHeader = reqHeader; } /** * 在JAXB标准中,@XmlElementWrapper注解表示生成一个包装 XML 表示形式的包装器元素。 * 此元素主要用于生成一个包装集合的包装器 XML 元素。因此,该注释支持两种形式的序列化。 * @XmlElementWrapper 仅允许出现在集合属性上 * @return */ @XmlElementWrapper(name = "SMSBODYS") @XmlElement(name = "SMSBODY") public List<SmsBody> getSmsBodys() { return smsBodys; } public void setSmsBodys(List<SmsBody> smsBodys) { this.smsBodys = smsBodys; }}
测试代码:
public class Test { /** * XML 转转为 JavaBean * @param xml * @param t * @param <T> * @return * @throws JAXBException */ public static <T> T xmlToBean(String xml, T t) throws JAXBException { JAXBContext context = JAXBContext.newInstance(t.getClass()); Unmarshaller um = context.createUnmarshaller(); StringReader sr = new StringReader(xml); t = (T) um.unmarshal(sr); return t; } /** * JavaBean 转换为 XML * @param t * @param <T> * @return * @throws JAXBException * @throws FileNotFoundException */ public static <T> StringWriter beanToXml(T t) throws JAXBException, FileNotFoundException { JAXBContext context = JAXBContext.newInstance(t.getClass()); Marshaller m = context.createMarshaller(); StringWriter sw = new StringWriter(); m.marshal(t,sw); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); m.marshal(t,new FileOutputStream("/test.xml")); m.marshal(t,System.out); return sw; } public static void main(String[] args) throws JAXBException, FileNotFoundException { ReqHeader reqHeader = new ReqHeader(); reqHeader.setReqNo("1"); reqHeader.setAuthCode("AAA"); reqHeader.setSysId("AAA123"); SmsBody smsBody = new SmsBody(); smsBody.setContent("测试1"); smsBody.setDestAddr("15888"); smsBody.setSourceAddr("888"); SmsBody smsBody1 = new SmsBody(); smsBody1.setContent("测试2"); smsBody1.setDestAddr("159898"); smsBody1.setSourceAddr("989898"); SmsDeliverReq smsDeliverReq = new SmsDeliverReq(); smsDeliverReq.setReqHeader(reqHeader); List<SmsBody> smsBodys = new ArrayList<SmsBody>(); smsBodys.add(smsBody); smsBodys.add(smsBody1); smsDeliverReq.setSmsBodys(smsBodys); StringWriter sw = beanToXml(smsDeliverReq); System.out.println(sw.toString()); SmsDeliverReq xmlToBean = xmlToBean(sw.toString(), smsDeliverReq); System.out.println(xmlToBean.getSmsBodys()); System.out.println(xmlToBean.getSmsBodys().get(0).getContent()); }
生成的xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><SMSDELIVERREQ> <REQHEADER> <AUTHCODE>AAA</AUTHCODE> <REQNO>1</REQNO> <SYSID>AAA</SYSID> </REQHEADER> <SMSBODYS> <SMSBODY> <CONTEXT>测试1</CONTEXT> <DATE>2017-07-03T16:05:56.722+08:00</DATE> <DESTADDR>15888</DESTADDR> <SOURCEADDR>888</SOURCEADDR> </SMSBODY> <SMSBODY> <CONTEXT>测试2</CONTEXT> <DESTADDR>159898</DESTADDR> <SOURCEADDR>989898</SOURCEADDR> </SMSBODY> </SMSBODYS></SMSDELIVERREQ>
JDK中JAXB相关的重要Annotation:
@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属性。
注意:序列化的java类的成员遍历不能声明为public的,
注意:@XmlElementWrapper仅允许出现在集合属性上。
- marshaller、unmarshaller解析xml及读取xml
- xml解析系列(二)——用Marshaller和Unmarshaller解析xml
- Marshaller和Unmarshaller用法示例
- castor Unmarshaller 读取XMl文件 运行没报错,但是读取值为null 问题解决
- 解析读取 xml 文件
- dom4j读取,解析xml
- XMl文件解析读取
- 读取解析xml文件
- jquery 解析xml文档 读取属性及文本内容
- 读取xml文件 解析双层xml
- xml及json解析
- XML简介及解析
- XML及PullParser解析
- JavaScript解析读取XML文档
- JavaScript 解析读取XML文档
- JavaScript 解析读取XML文档
- cocos2dx读取xml详细解析
- cocos2dx读取xml详细解析
- 杭电acm 1573X问题(中国剩余定理)
- PHP——ajax(远程连接)
- 《JavaScript 高级程序设计》读书笔记(一)
- 两个系统部署在一个服务器,造成session冲突!
- string-stringbuffer-stringbuilder区别
- marshaller、unmarshaller解析xml及读取xml
- win10下ant下载安装配置记录
- [codevs2192]删数
- Linux下OpenCV设置摄像头帧率FPS
- 程序员的圣经
- ionic3对安卓硬件返回的处理
- spring源码构建时缺失spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar
- 如何利用 LTE/4G 伪基站+GSM 中间人攻击攻破所有短信验证 ,纯干货!| 硬创公开课
- 玩转Docker Network