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。
分享到:
相关推荐
使用jaxb生成XML例子,含有例子和注解解析
Jaxb简单例子,学习注解及java与xml的互相转换,比较基础,大家互相学习
jaxb学习资料
一个基于java jaxb的序列化例子,非常简单易懂。jaxb是java标准的序列化方案,实现方式简单,是一种很好用的java xml 序列化反序列化方式
JAXB的使用JAXB的使用JAXB的使用JAXB的使用
CamelJAXB示例 骆驼和 JAXB 的简单例子 此应用程序是在本地主机上运行 Apache Camel 并使用 Camel Routes 和 JAXB 数据格式的示例。 享受
JAXB学习笔记 项目为了进行xml与java bean的互转,参考了各位网友的推荐,最后选型为JAXB,闲暇之余整理了一下笔记。废话不多说,上代码
NULL 博文链接:https://lijie-insist.iteye.com/blog/2160015
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。JAXB与xml相互转换实例。
jaxb资料及实例,里面还包含了其他资料地址2
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。主要功能是生成XML文件和解析XML文件。
无需安装,解压后即可。jaxb-api.jar,jaxb-xjc.jar,jaxb-impl.jar,activation.jar等相关jar包在lib文件夹下。
jaxb-api jaxb-impl jar
Jaxb annotation 使用 Jaxb annotation初步使用
JAXB的安装包及插件
JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件
JAXB的HelloWorld源码,适合想学习JAXB技术的新手学习。
jaxb解析生成xml例子
在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个错误,按照打出的信息Use the endorsed directory mechanism to place jaxb-api.jar in ...
JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术