JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
好了,废话少说,看看简单的例子。

介绍下相关的类。SmsDeliverReq是一个请求对象,类中有两个属性,分别为ReqHeader reqHeader和List<SmsBody> smsBodys。ReqHeader和SmsBody都为自定义类型。这两个类中的属性都为基本数据类型。

现在需要做的是将SmsDeliverReq的实例转换为xml和将xml转换为SmsDeliverReq实例,Test.java中封装了xml->javabean 和 javabean->xml的两个方法。并且实现了将生成的xml格式的字符串保存到xml文件中

ReqHeader.java

package cn.mr.javabeanxml;

import javax.xml.bind.annotation.XmlElement;

/**
* 请求头对象
* @author xuejiangtao
* Jul 25, 2013 9:33:57 PM
*/
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;
} }

SmsBody.java

package cn.mr.javabeanxml;

import javax.xml.bind.annotation.XmlElement;

/**
* 请求内容
* @author xuejiangtao
* Jul 25, 2013 9:34:16 PM
*/
public class SmsBody { /**
* 短信内容
*/
private String content; /**
* 手机号
*/
private String sourceAddr; /**
* 服务代码
*/
private String destAddr; public String getContent() {
return content;
} @XmlElement(name="CONTENT")
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;
} }

SmsDeliverReq.java

package cn.mr.javabeanxml;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement; /**
* 请求对象
* @author xuejiangtao
* Jul 25, 2013 9:34:26 PM
*/
@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;
} @XmlElementWrapper(name="SMSBODYS")
@XmlElement(name="SMSBODY")
public List<SmsBody> getSmsBodys() {
return smsBodys;
} public void setSmsBodys(List<SmsBody> smsBodys) {
this.smsBodys = smsBodys;
}
}

Test.java

package cn.mr.javabeanxml;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List; import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller; import cn.mr.javabeanxml.ReqHeader;
import cn.mr.javabeanxml.SmsBody;
import cn.mr.javabeanxml.SmsDeliverReq; public class Test { /**
* XML转换为javabean
* Jul 25, 2013 9:39:05 PM xuejiangtao添加此方法
* @param <T>
* @param xml
* @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
* Jul 25, 2013 9:39:09 PM xuejiangtao添加此方法
* @param smsDeliverReq
* @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("src/cn/mr/javabeanxml/test.xml"));
return sw;
} /**
* Jul 24, 2013 10:12:39 PM xuejiangtao添加此方法
* @param args
* @throws JAXBException
* @throws FileNotFoundException
*/
public static void main(String[] args) throws JAXBException, FileNotFoundException {
ReqHeader reqHeader = new ReqHeader();
reqHeader.setReqNo("111");
reqHeader.setAuthCode("DDDD");
reqHeader.setSysId("jjj"); SmsBody smsBody = new SmsBody();
smsBody.setContent("类容讷讷");
smsBody.setDestAddr("1589594");
smsBody.setSourceAddr("9999"); SmsBody smsBody1 = new SmsBody();
smsBody1.setContent("asdf");
smsBody1.setDestAddr("asdf");
smsBody1.setSourceAddr("4fdf"); 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.toString());
}
}

一下内容来自百度百科,个人觉得非常重要。
JDK中JAXB相关的重要Class和Interface:
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller接口,将Java对象序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。

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属性。
其他:
对于要序列化(marshal)为XML的Java类,绝不能把成员变量声明为public,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。
对于JAXB相关的重要Annotation的声明,如@Xml.....,可以放在成员变量的setter()或getter()方法上,两者中任选其一即可,但决不能放在成员变量上,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。

marshaller unmarshaller解析xml和读取xml的更多相关文章

  1. Java 操纵XML之读取XML文件

    Java 操纵XML之读取XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...

  2. 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合

    转自:http://blog.csdn.net/zhao19861029/article/details/8473245 首先实现生成对应的JAVAbean的XML文件方法 /** * DMO4J写入 ...

  3. C#基础精华06(Linq To XML,读取xml文件,写入xml)

    1.XML概述: 可扩展标记语言XML(eXtensible Markup Language)是一种简单灵活的文本格式的可扩展标记语言,侧重于存储数据. 2.XML特点 xml 标记语言 html x ...

  4. js读取xml,javascript读取XML

    IE下示例代码: var xmlDoc = "<root><AlleyWay><Code>1103</Code><Name>胡同2 ...

  5. Linq to XML 读取XML 备忘笔记

    本文转载:http://www.cnblogs.com/infozero/archive/2010/07/13/1776383.html Linq to XML 读取XML 备忘笔记 最近一个项目中有 ...

  6. Unity3d 新建xml 读取xml

    在游戏开发中.Xml常常被用来作为技能配置.地图配置.人物动作配置等配置文件. Unity3d内置的Xml库让我们非常方便地就能够新建Xml和读取Xml. 以下是一个样例,新建了一个Xml文档.而且读 ...

  7. 应用Xml.Linq读xml文件

    c#提供了System.Xml.Linq操作xml文件,非常方便,本文主要介绍如何应用System.Xml.Linq读取xml文件. xml文本 <?xml version="1.0& ...

  8. 使用DOM4J解析XMl文件与读取XML文件

    XML文件 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id ...

  9. 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)

    原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <student ...

随机推荐

  1. Linux期中总结

    在MOOC八周内容高度概括总结如下 (一)计算机是如何工作的 冯诺依曼体系结构——核心:存储程序计算机; X86汇编基础 (二)操作系统是如何工作的 三个法宝——存储程序计算机.函数调用堆栈.中断机制 ...

  2. WebAPI实例--第一个API

    今天终于做了第一个任务,学习API之后的第一个实例.销售设置开发API. 第一.层次结构 1.API各层 项目结构主要有五层,分别为API.BizModel.Data.DBModel.Logic. 2 ...

  3. 作业6-COSPLAY孩子他家长

    为了我提高我女儿的数学能力,我以下我会根据我想要的功能做出相应的解决方案,为了孩子,父母也可以想的比老师周到.可怜天下父母心. 编号.          名称.                     ...

  4. David Silver强化学习Lecture1:强化学习简介

    课件:Lecture 1: Introduction to Reinforcement Learning 视频:David Silver深度强化学习第1课 - 简介 (中文字幕) 强化学习的特征 作为 ...

  5. MySQLi面向对象实践--insert、update、delete

    执行insert <?php $mysqli = new Mysqli(); $mysqli->connect("localhost","root" ...

  6. shell脚本--文件包含

    首先介绍一下shell中包含文件的方法,在C,C++,PHP中都是用include来包含文件,Go和Java使用import来包含(导入)包,而在shell中,很简单,只需要一个点“.”,然后跟着文件 ...

  7. Jmeter 常用断言使用

    响应断言 可根据要测试响应字段和模式匹配规则来设置断言,比如下方截图是匹配返回的结果中是否包含"code:200,",如果包含则表示断言成功,否则失败.响应断言可添加多个,但是多个 ...

  8. 面象对象设计原则之五:依赖倒置原则(The Dependency Inversion Principle,DIP)

    如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现.依赖倒转原则是Robert C. Martin在1996年为“C++Reporte ...

  9. [百家号]看完再也不会被坑!笔记本接口大揭秘:HDMI、DP、雷电

    看完再也不会被坑!笔记本接口大揭秘:HDMI.DP.雷电 https://baijiahao.baidu.com/s?id=1577309281431438678&wfr=spider& ...

  10. Lodop打印设计界面生成代码带”...(省略)”

    Lodop的设计界面中,菜单里的生成代码,如果打印项内容过多,后面会显示”...(省略)”,省略的是打印项的内容值,无论是纯文本还是超文本,都可以用选中打印项-右键-设置属性里找到该打印项的全部值,可 ...