JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具。它可以使XML数据以Java Objects的形式直接应用于Java程序之中,使Java Objects与XML数据之间的转换成为可能。在JAXB中将Java Objects到XML数据的转换称为marshal;XML数据到Java Objects的转换称为unmarshal。
如图所示,使用JAXB分两步,首先利用xjc命令行程序编译DTD或Schema文件生成与XML数据结构相对应的JavaBeans类,再通过JAXB API中的marshal与unmarshal操作完成JavaBeans对象与XML数据之间的互换。
JAXB使用了最新的元数据技术,故而只能在JDK 1.5以上版本使用,JAXB的官方网站如下:
https://jaxb.dev.java.net/
可以在其中下载到最新的JAXB。安装之后的JAXB目录结构如下:
/JAXB-HOME(path/to/jaxb)
/bin
/lib
/docs
在bin目录中有所有的JAXB工具,其中包括xjc命令行程序;在lib目录中可以找到所有JAXB的jar包;在docs目录中有一个JAXB的使用帮助及API说明。
一. xjc使用帮助
1. 通过命令行编译
命令行程序xjc用于编译DTD或Schema生成与XML数据结构对应的JavaBeans类。操作方法如下:
xjc [-xmlschema|-dtd] [–d 保存java文件的目录] [–p java文件所在的包] <编译文件>
-xmlschema 指定编译文件的格式为Schema格式,此参数是默认值,可以不用提供。
如果不提供此参数,编译文件必须是Schema文件。
-dtd 指定编译文件的格式为DTD格式,如果编译文件是DTD文件则必须提供此参数。
-d 指定了保存java文件的目录
-p 指定了生成的java文件所在的包
例如编译当前目录下的schema.xls文件,java文件保存在src目录,包名为generate,其命令如下:
xjc –d src –p generate schema.xsd
如果编译文件是schema.dta,则命令如下:
xjc –dtd –d src –p generate schema.dtd
2. 通过ANT编译
在/JAXB-HOME/lib目录中的jaxb-xjc.jar包中包含了XJCTask.class文件,可以依据该类定义一个ant task,通过执行该task生成java文件,task的定义如下:
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
<classpath>
<fileset dir="${JAXB-HOME}/lib" includes="*.jar" />
</classpath>
</taskdef>
执行xjc task的ant代码样例如下:
<target name="generate" description="generate Java source files">
<echo message="generate java from schema..." />
<mkdir dir="src" />
<xjc schema="books.xsd" package="com.chris.jaxb" destdir="gen-src">
<produces dir="src/com/chris/jaxb " includes="**/*.java" />
</xjc>
</target>
其中
schema 指定DTD或Schema文件的位置;
destdir 指定生成的java文件所保存的根目录;
package 指定生成的java文件所在的包;
args 指定额外的参数,其中最重要的参数是“-dtd”,如果schema指定的是一个DTD文件,则args中必须提供“-dtd”;
produces 用于在指定目录中检查最新版本。
二. 序列化(Marshalling)与反序列化(Unmarshalling)
要想在Java程序中使用JAXB,必须用到以下几个jar包:
jaxb-api.jar
jaxb-impl.jar
activation.jar
jsr173_1.0_api.jar
以上包均在/JAXB-HOME/lib目录中可以找到。
JAXB的核心类是JAXBContext类,该类可以根据一个包名或一个类名加载Java Objects。
使用包名加载Java Objects的样例如:
JAXBContext jc = JAXBContext.newInstance("generate");
其指定的包中必须包含ObjectFactory类,该类由xjc生成,用于生成XML数据所对应的Java Objects。
如果使用类名加载Java Object,例如:
JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
其指定的类必须是用于生成Java Objects的工厂类,如ObjectFactory类。
为了方便使用,下面的代码封装了JAXB相关类,样例以包名加载方式为主,提供了基本的marshal与unmarshal操作。
- package generated;
-
- import java.io.InputStream;
- import java.io.OutputStream;
-
- import javax.xml.bind.JAXBContext;
- import javax.xml.bind.JAXBException;
- import javax.xml.bind.Marshaller;
- import javax.xml.bind.Unmarshaller;
-
- public class JAXBUtils {
-
- private JAXBUtils() {
-
- throw new UnsupportedOperationException();
- }
-
- public static Object unmarshal(String contextPath, InputStream xmlStream)
- throws JAXBException {
-
- JAXBContext jc = JAXBContext.newInstance(contextPath);
- Unmarshaller u = jc.createUnmarshaller();
-
- return u.unmarshal(xmlStream);
- }
-
- public static void marshal(String contextPath, Object obj,
- OutputStream stream) throws JAXBException {
-
- JAXBContext jc = JAXBContext.newInstance(contextPath);
- Marshaller m = jc.createMarshaller();
- m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
- m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
-
- m.marshal(obj, stream);
- }
- }
使用这个工具类非常简单,代码如下:
- public class JaxbTest {
-
- public static void main(String[] args) throws FileNotFoundException,
- JAXBException {
-
-
- InputStream is = new FileInputStream("C:/test.xml");
- Object obj = JAXBUtils.unmarshal("generate", is);
- System.out.println(v.getUserid());
-
-
- OutputStream f = new FileOutputStream("C:/Test1.xml");
- JAXBUtils.marshal("generate", obj, f);
- }
- }
分享到:
相关推荐
JAXB的使用JAXB的使用JAXB的使用JAXB的使用
如何更好地jaxb使用如何更好地jaxb使用如何更好地jaxb使用如何更好地jaxb使用
Jabx2 开发指南 xml 转换、序列化xml
JAXB框架,作用是对象和XML之间相互转化,本文档包含代码示例,介绍对象和XML如果使用JAXB相互转化 在代码里面备注了具体使用的文字说明
1. 什么是JAXB? Java Architecture for XML Binding (JAXB) 是一个业界的标准,是一项可以根据XML
java -jar JAXB2_20060607.jar On Windows, you can just double-click the jar file to execute. Release Notes Browse the release notes online, including what's new. Technical Support Please subscribe to...
无需安装,解压后即可。jaxb-api.jar,jaxb-xjc.jar,jaxb-impl.jar,activation.jar等相关jar包在lib文件夹下。
JAXB使用Socket流进行双向通信源码
jaxb-api jaxb-impl jar
JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件 JAXB的 eclipse插件
使用jaxb生成XML例子,含有例子和注解解析
JAXB的安装包及插件
在使用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 ...
我刚写好的 一个简单的小程序 动行里面的read文件 是在idea 中用jaxb 读xml中数据
本人在公司用到了jaxb技术,这是在公司的学习文档,今天跟高兴个大家分享。
最新的JAXB API手册! JAXB_2.2_API.chm
JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术JAXB注解相关技术
如何使用JAXB框架定制Web服务行为.doc
赠送jar包:jackson-module-jaxb-annotations-2.2.3.jar; 赠送原API文档:jackson-module-jaxb-annotations-2.2.3-javadoc.jar; 赠送源代码:jackson-module-jaxb-annotations-2.2.3-sources.jar; 赠送Maven依赖...
jaxb-2.2.jar jaxb jax