`

jaxb学习简单例子

    博客分类:
  • java
阅读更多
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简单例子

    **JAXB(Java Architecture for XML Binding)**是Java平台中用于XML绑定的规范,它提供了一种自动将Java对象转换为XML文档以及从XML...通过学习这个简单的例子,你将能够掌握基本的JAXB操作,并将其应用于实际项目中。

    jaxb学习资料

    ### jaxb学习资料知识点详解 #### 一、JAXB概览 JAXB,全称为Java Architecture for XML Binding,是一种用于处理XML数据的Java API。它允许开发者将Java类与XML文档之间的转换过程自动化,从而简化了数据交换的...

    一个基于java jaxb的序列化例子,非常简单易懂

    在给定的例子"JAXBDemo"中,我们可以预期它包含了一个简单的JAXB使用示例,帮助我们理解这一过程。 首先,让我们了解一下JAXB的工作原理。JAXB的核心思想是通过元数据(如注解或XML Schema)将Java类与XML结构关联...

    jaxb (XML操作)

    2. **实例化(Unmarshalling)**:当需要将XML数据转换为Java对象时,JAXB使用Unmarshaller接口解析XML文档,生成对应的Java对象。这个过程是将XML数据"反序列化"为可操作的Java对象。 3. **序列化(Marshalling)*...

    jaxb-ri-2.2.7

    3. **源代码**:如果包含源码(如`src`目录),开发者可以查看和学习JAXB的内部实现,或者对其进行定制和扩展。 4. **示例和教程**:可能包含演示如何使用JAXB的示例代码(如`samples`目录),这些例子可以帮助初学...

    JAXB 学习笔记

    **JAXB(Java Architecture for XML Binding)学习笔记** JAXB是Java平台标准版(Java SE)的一部分,它提供了一种方便的方式来将XML数据绑定到Java对象上,以及将Java对象转换为XML数据。这个强大的工具使得开发...

    JAXB的HelloWorld源码

    在这个例子中,我们通常会创建一个简单的Java类,比如`HelloWorld`,并用JAXB注解来描述如何映射到XML元素。例如: ```java import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation....

    JAXB学习笔记

    此外,JAXB还支持复杂的XML结构,如命名空间、属性群组、继承和多态性,使得处理XML数据变得更加简单。 然而,JAXB也有其局限性,比如它可能不适合处理大型XML文档,因为它会将整个XML文档加载到内存中。对于这种...

    CamelJAXBExample:骆驼和 JAXB 的简单例子

    通过阅读和理解这些文件,你可以学习如何在实际项目中结合 Camel 和 JAXB 来处理 XML 数据。 总结来说,"CamelJAXBExample" 是一个展示如何在 Apache Camel 中利用 JAXB 处理 XML 数据的示例。这个例子将帮助开发者...

    jaxb入门学习

    以下是一个简单的示例,展示了如何使用JAXB操作XML文档。 1. **环境配置**:使用JDK 1.5、JWSDP 2.0、Ant 1.6。 2. **引入JAXB的jar包**:确保项目中包含了JAXB所需的库文件。 3. **编写Ant构建文件**:设置项目的...

    jaxb功能用法

    JAXB允许我们通过简单的API来实现XML的序列化(将Java对象转换为XML)和反序列化(将XML转换回Java对象)。在这个"jaxb功能用法"的讨论中,我们将深入探讨如何利用JAXB进行XML与Java Bean之间的转换,并结合XSD(XML...

    《Jaxb2 转换XML文档》学习笔记

    JAXB2提供了基于注解的API,使得XML和Java之间的映射变得简单直观。通过在Java类上使用特定的注解,如`@XmlRootElement`和`@XmlElement`,我们可以指定哪些类和字段应该被映射到XML元素。 2. **生成Java模型** ...

    数据绑定之JAXB

    通过深入学习和实践以上知识点,开发者可以熟练地运用JAXB进行数据绑定,无论是在简单的数据交换,还是在复杂的业务场景中,都能发挥出JAXB的强大功能。对于“atf-TRUNK”这个文件名,可能是指一个软件项目的主分支...

    使用JAXB完成JAVAbean与xml互转

    通过学习和掌握JAXB,开发者可以更高效地处理XML数据,提高开发效率,同时降低出错的可能性。在提供的压缩包文件`Jaxb`中,你应该能找到一些示例代码,可以通过运行这些代码来加深对JAXB的理解。在实践过程中,先...

    jaxb:这是jaxb项目的最终版本

    **Java JAXB 深度解析** Java Architecture for XML Binding(JAXB)是Java平台上的一个标准组件,用于在XML和Java对象之间进行自动转换。...通过学习和掌握JAXB,开发者能够更高效地在XML和Java世界之间架起桥梁。

    使用jaxb将XML转化为JAVA BEAN

    JAXB不仅适用于简单的对象转换,还可以处理复杂的数据结构,包括嵌套的对象、数组和集合。通过使用`@XmlElementWrapper`、`@XmlAccessorType`等注解,可以定制更复杂的映射规则。 除了基本的注解,JAXB还提供了许多...

    resteasy-jaxrs-2.2 学习整理的例子

    通过深入学习这个例子,开发者可以更好地理解和掌握RESTEasy框架以及JAX-RS 2.2规范,同时也会熟悉JAXB在REST服务中的作用,尤其是JSON数据处理。这对于构建高效、健壮的RESTful Web服务至关重要。

    用XFire开发Webservice简单实例

    **标题:“用XFire开发Webservice简单实例”** 在IT行业中,Web服务是不同系统间进行数据交换和功能调用的重要方式。XFire是Apache软件基金会的一个开源项目,它提供了一个轻量级、高效的框架来创建和消费Web服务。...

    CXF 服务端简单实例

    总的来说,这个CXF服务端实例是学习和理解CXF框架如何工作的一个好起点。它涵盖了从创建服务接口到部署服务端点的全过程,对于初学者来说,是一个不错的实践项目。通过这个实例,你可以深入理解Web服务的概念,以及...

    JAXBDemo:JAXB(Java Architecture for XML Binding)的演示,它允许在 XML 和 java 类之间轻松转换

    JAXB使得XML的解析、生成以及数据绑定变得更加简单,避免了手动编写XML解析和生成代码的繁琐工作。 在项目**JAXBDemo**中,我们可以看到一个关于如何使用JAXB进行实际操作的示例。这个项目的核心目标是展示如何通过...

Global site tag (gtag.js) - Google Analytics