摘要: JAXB 作为JDK的一部分,能便捷地将Java对象与XML进行相互转换,本教程从实际案例出发来讲解JAXB 2 的那些事儿。完整版目录
学前导读
JAXB 支持两种方式的XML与Java Bean 相互转化,上一节介绍的是基于注解的方式,这节主要关于另一种方式
xjc
。xjc
需要使用到 schema 文件,这一节的主要任务是将 XML 文件(以.xml结尾)转化为 schema 文件(以.xsd结尾)。如果你已经有了生成好的 schema 文件,可以直接忽略这一小节。
演示基于 Windows 7 + jdk 8。
有很多种方式可以获取到 schema 文件,这里我采用的是 Trang
。可以在 Trang 网站 找到最新版的安装包,不过其文件存放在Google,已经有人将整个压缩包上传到。
Trang 介绍
Trang 可以对多种 schema 语言转换为XML,目前已支持
XML 语法
,XML 1.0 DTD
,W3C XML Schema
等。Trang 为创造易于阅读的 schema 而存在,不过已经停止维护。
将下载的trang(xml转xds).zip
(约1M)文件解压,得到trang.jar
。我将其放置于电脑的 E:\JAXB
,将需要转换的XML文件放置于同一目录下。
按住Shift
键,单机鼠标右键,在弹出的对话框中,选择在此处打开命令窗口
,如下图:
首先测试是否安装好jdk,java -version
顺利输出,说明安装正确。
E:\JAXB>java -version
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
Trang 使用
使用命令 java -jar trang.jar book.xml book.xsd
,没有错误输出,说明一切顺利。
E:\JAXB>java -jar trang.jar book.xml book.xsd
E:\JAXB>
使用的命令不算复杂,常规的 java 命令 java -jar trang.jar
,两个参数分别指定了输入xxx.xml
和输出xxx.xsd
。
可以在相同的目录下看到生成的文件。
Trang的完整语法支持:
java -jar trang.jar [-C catalogFileOrUri] [-I rng|rnc|dtd|xml] [-O rng|rnc|dtd|xsd] [-i input-param] [-o output-param] inputFileOrUri ... outputFile
- -C 文件还是uri
- -I 输入文件格式,rng表示宽松XML语法,rnc表示严禁XML语法,dtd表示XML 1.0 DTD,xsd表示W3C XML Schema,xml 表示一般XML 文件
- -O 输出文件格式
- -i 一般输入参数,对不同的格式,支持不同的参数。如
encoding=ISO-8859-1
表示使用指定的字符编码ISO-8859-1
,而不是文件头<?xml versinotallow="1.0" encoding="GB2312" standalnotallow="yes"?>
中指定的编码。 - -o 一般输出参数,对不同的格式,支持不同的参数。如
indent=4
,表示每一个层级缩进的空格数。
指定输入文件格式: java -jar trang.jar -I xml book.xml book.xsd
指定输入文件编码: java -jar trang.jar -i encoding=UTF-8 book.xml book.xsd
指定输出的层级空格数: java -jar trang.jar -o indent=10 book.xml book.xsd
多个输入同时转换为一个输出: java -jar trang.jar book.xml student.xml union.xsd
结果展示
这里我使用的book.xml
是一个简单的XML,只有少量的元素,且结构单一。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book>
<id>00011</id>
<name>Math</name>
<price>25.0</price>
</book>
生成的 schema 文件如下,相对于原始文件,庞大不少:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element ref="id"/>
<xs:element ref="name"/>
<xs:element ref="price"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="id" type="xs:integer"/>
<xs:element name="name" type="xs:NCName"/>
<xs:element name="price" type="xs:decimal"/>
</xs:schema>
如果对稍微复杂点的XML文件books.xml
转换:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<books>
<book id="00011">
<name>Math</name>
<price>25.0</price>
</book>
<book id="0002s1">
<name>English</name>
<price>28.0</price>
</book>
</books>
使用命令E:\JAXB>java -jar trang.jar books.xml books.xsd
转化以后,得到的 schema 文件更为复杂。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="books">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="book"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="price"/>
</xs:sequence>
<xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
</xs:complexType>
</xs:element>
<xs:element name="name" type="xs:NCName"/>
<xs:element name="price" type="xs:decimal"/>
</xs:schema>
下节预览
在得到了 schema 文件后,就可以使用 xjc
工具来生成 Java bean 了,下一节来聊一聊如何将schema 文件转化为 Java bean。