JAXB的介绍(转载)

摘要:
另一方面,JAXB提供了一种将XML模式绑定到Java表示的快速简便的方法,这样Java开发人员可以轻松地将XML数据和Java应用程序中的处理功能结合起来。JAXB隐藏了细节并删除了SAX和DOM之间无用的关系——生成的JAXB类只描述了原始模型中定义的关系。5) 通过JAXB对XML文档的操作主要包括:解析符合XML Schema的XML文档,生成一组相应的Java对象;对这些物体进行操作;然后将这些对象的内容保存到XML文档中。

< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

一、前言。
最近正在做一个项目,根据需求计划需要一种Object <--> XML的工具,而JAXB就非常符合需求,于是以下是近天来的研究心得。

二、JAXB技术介绍

1.什么是JAXB
Java Architecture for XML Binding (JAXB)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程序中利用平台核心XML数据的灵活性。而且,可以充分利用XML的优势而不用依赖于复杂的XML处理模型如SAXDOMJAXB隐藏了细节并且取消了SAXDOM中没用的关系——生成的JAXB类仅描述原始模型中定义的关系。其结果是结合了高度可移植Java代码和高度可移植的XML数据。其中这些代码可用来创建灵活、轻便的应用程序和Web服务。

2. JAXB的体系结构
JAXB学习 - mengshj - 可可的梦幻世界
JAXB的体系结构和应用过程如图所示,一般来说包含以下几个步骤:

1)根据你的应用程序所要操作的XML数据格式,撰写相应的XML Schema,有关XML Schema的知识,请参阅“参考资料

2)使用JAXB所带的编译工具(Binding Compiler),将这个XML Schema文件作为输入,产生一系列相关的Java ClassInterface

3)在使用JAXB编译工具的时候,可以有选择性的提供一个配置文件(图的虚线部分),来控制JAXB编译工具的一些高级属性。

4)这些Java ClassInterface是你的应用程序操纵XML数据的主要接口和方法。

5)通过JAXBXML文档进行的操作主要包括:将符合XML Schema规定的XML文档解析生成一组相应的Java对象;对这些对象进行操作(修改、增加和删除对象的属性等等);然后将这些对象的内容保存到这个XML文档中。

三、安装介绍

1.开发环境准备

1)Java 1.5 JDK/JRE
(*)
你必须安装java运行环境

2)Eclipse SDK 3.2.x
Eclipse
推荐下载的版本是< xmlnamespace prefix ="st1" ns ="urn:schemas-microsoft-com:office:smarttags" />3.2.1

3) My Eclipse 5.x (推荐使用)
能为你的XML编写提供帮助,与Eclipse SDK 3.2.x配套使用。

2.开始安装:

1)需要下载的软件

A.下载开发工具包:Java Web Services Developer Pack 2.0
JAXB2.0
的正式版本的一个实现(大家一定要记住,JAXB只是一个标准,Sun公司提供的此工具包只能说是这个标准的一个实现)已经发布了。由于XMLWeb Services中的大量应用,所以,JAXB2.0作为Web Services开发包的一部分,可以从SUN的官方网站下载。其中jaxb包含在jaxb子目录下。

B. XML文档解析:xerces-2_9_0
Xerces
是由Apache组织所推动的一项XML文档解析开源项目,jwsdp提供的xerces似乎有Bug,建议下载最新版本,下载请到Apache的官方网站下载

2)环境变量配置
要使用JAXB,在下载JAXB开发包以后,还要设置一些环境变量,主要是设置classpath的路径,以提供JAXB包所带的库文件的位置。
< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />

JAVA_HOME=D:\java\jdk1.5.0

JWSDP_HOME=D:\Sun\jwsdp-2.0

JAXB_HOME=%JWSDP_HOME%\jaxb

JAXB_LIBS=%JAXB_HOME%\lib

JAXP_LIBS=%JWSDP_HOME%\jaxp\lib

JWSDP_LIBS=%JWSDP_HOME%\jwsdp-shared\lib

PATH=%JAXB_HOME%\bin;%JWSDP_HOME%\jwsdp-shared\bin;%PATH%

CLASSPATH= %JWSDP_HOME%\jaxb\lib\jaxb-api.jar;

%JWSDP_HOME%\jaxb\lib\jaxb-impl.jar;

%JWSDP_HOME%\jaxb\lib\jaxb-xjc.jar;

%JWSDP_HOME%\jwsdp-shared\lib\activation.jar;

%JWSDP_HOME%\sjsxp\lib\jsr173_api.jar;

%JWSDP_HOME%\sjsxp\lib\sjsxp.jar;

< xmlnamespace prefix ="w" ns ="urn:schemas-microsoft-com:office:word" />
注:注意自己原来的CLASSPATH设置,不要覆盖了。

3) Eclipse工程构建路径配置:
JAXB学习 - mengshj - 可可的梦幻世界JAXB学习 - mengshj - 可可的梦幻世界
注:如图所示的JAR都添加到工程的构建路径中。

四、实例分析

1.确定XML Schema
要确定XML Schema意味着你要确定一个规则,来约束你的XML文档,使所有符合这个规则的XML文档看上去都很类似。例如,在这个例子中,我们希望XML文档的格式如下:

<?xml version="1.0" encoding="UTF-8"?>

<users>

<user>

<name>小李</name>

<sex>男</sex>

<age>24</age>

</user>

<user>

<name>小丽</name>

<sex>女</sex>

<age>18</age>

</user>

<user>

<name>小王</name>

<sex>男</sex>

<age>22</age>

</user>

</users>

XML文档所包含的意思:一个用户组<users>里面有多个<user>,而每个<user>又包括<name><sex><age>这些信息,而要在应用程序中想要操纵此XML文档,还要根据这个XML文档,产生一个Schema文档。

<?xml version="1.0" encoding="UTF-8"?>

<schema targetNamespace="us" xmlns="http://www.w3.org/2001/XMLSchema"

xmlns:tns="us">

<simpleType name="Sex">

<restriction base="string">

<enumeration value="男"></enumeration>

<enumeration value="女"></enumeration>

</restriction>

</simpleType>

<complexType name="User">

<sequence>

<element name="name" type="string"></element>

<element name="age" type="int"></element>

<element name="sex" type="tns:Sex"></element>

</sequence>

</complexType>

<element name="user" type="tns:User"></element>

<complexType name="Users">

<sequence>

<element ref="tns:user" minOccurs="1"

maxOccurs="unbounded">

</element>

</sequence>

</complexType>

<element name="users" type="tns:Users"></element>

</schema>

SchemaXML文档之间的关系,就好像Java中类与实例的关系。每个符合schemaXML文档,都是这个Schema的一个实例;而Schema本身是一个模板,它规定了XML文档应该是什么样的。这个Schema描述了对xml文档的约束:

1)它规定了<users>这个节点内可以包含一个或多个<user>的节点。

2)每个<user>节点包括名字、年龄、性别这几个信息

3)规定了<sex>属性由“男”和“女”组成

2.使用编译工具生成相应的Java
有了Schema文件以后,我们就可以利用JAXB工具包,让它来替我们生成操纵符合这个Schema规定的所有XML实例文档的所有Java源代码。
如果已经设置好了环境变量的话(请参考“设置环境变量”),那么只需要运行JAXB包所带的“xjc”运行程序,例如
%JAXB_HOME%\bin\xjc.bat userSchema.xsd -d src –p primer.userinfo
其中:

A. %JAXB_HOME%是你安装JAXB工具包的位置,通常在jwsdp工具包的子目录下。

B. userSchema.xsdSchema的文件名,一般以xsd作为文件名的后缀。

C. -d 的选项,是指定系统生成的Java源代码所放置的目录,示例中为:src

D. -p 的选项,是指定系统生成的Java源代码所在的Java Package的名称,示例中为:primer.userinfo

E.还有更多的选项,请参考JAXB的相关文档。

如果运行成功的话,就会在你"-d"选项指定的目录下产生一些java代码文件:

3.在应用程序中使用这些代码
下面我们分析一下如何在我们的应用程序中使用JAXB工具包替我们生成的代码。

1) JAXBContext提供了一个入口,通过这个入口可以管理必要的XML/Java绑定信息。客户端应用程序通过newInstance(contextPath)方法得到该类的新实例。contextPath参数包含一个或多个Java包名,这些Java包就是了JAXB编译器所产生的接口代码所在的Java包。该参数值初始化JAXBContext对象,使得它能够管理JAXB编译器产生的接口。

JAXBContext jc = JAXBContext.newInstance("primer.userinfo");

2)而通过ObjectFactory,可以直接生成根节点java对象Users和子对象User。

User userA = objFactory.createUser();

Users users = objFactory.createUsers();

3)对于MarshallerUnmarshaller,这两个对象主要是用于Java对象和XML文档互相转换的主要接口(Marshaller负责从Java对象到XML文档的转换,Unmarshaller负责从XML文档到Java对象的转换)。

JAXBElement usersE = objFactory.createUsers(users);

Marshaller marshaller = jc.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal( usersE,newFileOutputStream("src/test.xml"));

Marshaller能把Users 对象转换成XML文件

JAXBElement usersE = (JAXBElement)jc.createUnmarshaller().unmarshal(newFile("src/test.xml"));

Users users = (Users)usersE.getValue();

Unmarshaller能把 XML文件转换成Users对象

4.实例代码

public voidjavaToXml() {

try{

JAXBContext jc = JAXBContext.newInstance("primer.userinfo"); //参数为JAXB生成的java文件所在包名

ObjectFactory objFactory =newObjectFactory(); //生成对象工厂

User userA = objFactory.createUser();

userA.setName("西瓜");

userA.setAge(26);

userA.setSex(Sex.);

User userB = objFactory.createUser();

userB.setName("冬瓜");

userB.setAge(19);

userB.setSex(Sex.);

User userC = objFactory.createUser();

userC.setName("南瓜");

userC.setAge(22);

userC.setSex(Sex.);

Users users = objFactory.createUsers();

List<User> list = users.getUser();

list.add(userA);

list.add(userB);

list.add(userC);

JAXBElement usersE = objFactory.createUsers(users);

Marshaller marshaller = jc.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal( usersE,newFileOutputStream("src/test.xml"));

}catch(Exception e) {

e.printStackTrace();

}

}

五、参考资料

1.JAXB
http://java.sun.com/webservices/jaxb/

2. XML Schema
http://www.w3.org/1999/05/06-xmlschema-1/
http://www.w3.org/1999/05/06-xmlschema-2/

免责声明:文章转载自《JAXB的介绍(转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ffmpeg拼接视频方法concatMFC全局函数开局——AfxGetApp解剖下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

notepad++添加自定义语言

步骤: 1.下载用户自定义语言XML文件 notepad++用户自定义语言XML文件下载 这里以jQuery为例,下载地址为:http://www.jamesallardice.com/downloads/notepadpp/jquery.zip 2.解压缩得到jquery.xml 和 userDefineLang_jQuery.xml两个文件。(注:若打...

微信公众平台开发(二):交互与接口

1、微信用户、微信服务器和后台服务器的交互 例:微信用户向公众号发送一条文本消息,这条消息会首先传给微信服务器,微信服务器处理这条信息并将其以xml数据格式传递给后台服务器,后台服务器接受到数据后会对数据进行处理,再响应数据以xml数据格式传递给微信服务器,微信服务器再响应到用户微信界面。 微信用户与微信后台服务器之间的交互过程就是数据传递过程,只不过需...

微软WPF技术应用与实践系列(窗体与导航+容器+模型+数据绑定配多个应用案例)

课程学习地址:http://www.ibeifeng.com/goods.php?id=160 自从微软推出第一个版本的.NET Framework,已经过去差不多8年了。3.0 是第一个随操作系统发布的框架,它附带在每个Windows Vista中,也可以支持Windows XP SP2 和 Windows Server 2003。由于.NET 2.0和...

XML和JSON数据格式

目录 XML DTD(文档类型定义) DTD实体 JSON 使用python解析JSON数据 XML和JSON的区别  XML的优缺点 JSON的优缺点 XML和JSON都是web存储和传输过程中数据的格式,其中JSON 使用比较广泛,主要用来前后端交互数据。 XML XML(Extensible Markup Language)扩展标记语言 ,是一种常...

C#操作Xml:通过XmlDocument读写Xml文档

什么是Xml? Xml是扩展标记语言的简写,是一种开发的文本格式。关于它的更多情况可以通过w3组织了解http://www.w3.org/TR/1998/REC-xml-19980210。如果你不知道它,那你就out太多了。 .Net是如何处理Xml的? 1.通过XmlDocument读写Xml文档 2.使用XmlReader读Xml,使用XmlW...

xml中设置button的背景颜色

在画几个设置界面,用到了button控件,对于button空间的背景色在不同状态下的颜色改变方法,做了一下尝试,发现了两种背景颜色改变的方法,就总结了下。 方法一尝试了好多遍才好,要点在于,在selector中android:drawable="@drawable/button_focus"引号中为xml文件,此xml文件为color类型,且在此color...