JAXB
(Java Architecture for XML Binding
)提供了一个快速而方便的方式绑定XML Schemas
和java
,使java
程序员能够很方便的在java
应用程序中处理XML
数据。JAXB
提供了将XML
文档解组为java
内容树的方法,以及将java
内容树重新编组回XML
文档的方法。JAXB
同样也提供了一种从java
对象生成XML Schema
的方式。
这里有几个重要的定义:
Ø 编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的 扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。
Ø 解组(Unmarshalling) 是把数据从存储媒介转换到内存中的过程--正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。
Ø 往返(Round-tripping)可能是最重要也最容易误解的数据绑定术语。往返用于描述从存储媒介到内存然后回到存储媒介的完整循 环。在 XML 和 Java 技术环境中,这就意味着从 XML 文档到 Java 实例变量,然后再回到 XML 文档。正确的往返要求,如果中间没有修改数据,XML 输入和 XML 输出应该是等同的。
生成Java文件:
1. 可以通过JAXB的bin中的xjc执行生成操作,命令如下:
xjc –p com.chris.jaxb test.xsd –d gen-src
-p <pkg>:指定生成java文件的package
-d <dir>:指定生成java文件的目录
其中-d所指定的目录必须是已经存在的,否则会报:“cowardly refuses to write to a non-existent directory "gen-src"”。
2. 使用ant生成
在ant文件中定义一个xjc的task,通过执行该task生成java文件,ant文件的定义:
<property name="jaxb.home" value="./lib" />
<path id="classpath">
<pathelement path="src" />
<fileset dir="${jaxb.home}" includes="*.jar" />
</path>
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
<classpath refid="classpath" />
</taskdef>
<target name="generate" description="generate Java source files">
<echo message="generate java from schema..." />
<mkdir dir="gen-src" />
<xjc schema="test.xsd" package="com.chris.jaxb" destdir="gen-src">
<produces dir="gen-src/com.chris.jaxb " includes="**/*.java" />
</xjc>
</target>
编组操作:
利用上面生成的java文件执行编组操作。
JAXBContext context = JAXBContext.newInstance("com.chris.jaxb");
//create java content tree
PurchaseOrderType po = new PurchaseOrderType();
………..
// create an element for marshalling
JAXBElement<PurchaseOrderType> poElement = (new ObjectFacory()).createPurchaseOrder(po);
// create a Marshaller and marshal to System.out
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(poElement, System.out);
解组操作:
通过xml文件执行解组操作。
JAXBContext context = JAXBContext.newInstance("com.chris.jaxb");
Unmarshaller um = context.createUnmarshaller();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema sc = sf.newSchema(Main.class.getResource("test.xsd"));
um.setSchema(sc);
JAXBElement<?> poEle = (JAXBElement<?>) um.unmarshal(new FileInputStream("po.xml"));
PurchaseOrderType pot = (PurchaseOrderType) poElement.getValue();
JAXB常用操作基本就这些,经过绑定xml和java对象可以很方便的执行一些xml操作,现在的一些webservice框架也都采用了JAXB作为绑定方式,所以JAXB的基本原理还是很有必要了解下的。