文章21 | 阅读 8258 | 点赞0
摘要: JAXB 作为JDK的一部分,能便捷地将Java对象与XML进行相互转换,本教程从实际案例出发来讲解JAXB 2 的那些事儿。完整版目录
JAXB 支持两种方式的XML与Java Bean 相互转化,之前介绍过基于注解的方式,这节介绍另一种方式 xjc
。xjc
属于jdk
的命令行工具,用于将schema文件生成java实体类。
在上一节中,我们已经得到了 schema 文件,现在的主要任务是将 schema 转换为 Java bean。
演示基于 Windows 7 + jdk 8
找到生成好的 xsd 文件,在当前文件夹下,按住Shift
键,单机鼠标右键,在弹出的对话框中,选择在此处打开命令窗口
,如下图:
首先测试是否安装好 xjc,xjc -version
顺利输出,说明安装正确。如果没有正确输出,可能是没有配置好jdk,需要设置环境变量。
E:\JAXB>xjc -version
xjc 2.2.8-b130911.1802
我的 schema 文件是 book.xsd
,使用最简单的转换命令:
xjc book.xsd
命令行工具展示解析过程:
E:\JAXB>xjc book.xsd
正在解析模式...
正在编译模式...
generated\Book.java
generated\ObjectFactory.java
查看文件夹generated
,可以看到两个生成的Java 文件。
上例中,演示的是最简单的命令,使用了很多默认参数,实际上xjc
支持的参数非常多,列举常用的几个参数及其含义。
参数 | 取值 | 含义 |
---|---|---|
-b | file/dir | 指定其他的binding 文件 或文件夹 |
-d | dir,默认为generated | 生成的文件存放在该文件夹下 |
-p | pkg,默认为generated | 生成的Java文件使用的包名 |
-xmlschema | 默认 | 指定输入为W3C XML Schema |
-relaxng | 指定输入为 RELAX NG | |
-relaxng-compact | 指定输入为 RELAX NG compact | |
dtd | 指定输入为 XML DTD | |
-version | 查看 xjc 的版本 |
xjc -p com.traing.bean book.xsd
E:/JAXB/com/traing/book/Book.java
中发现指定的包名。package com.traing.bean;
xjc book.xsd -d e:\JAXB\com
E:/JAXB/com/Book.java
,值得注意的是,这里的e:\JAXB\com
必须是一个存在的文件夹,否则不成功,错误提示拒绝写入不存在的目录 "e:\JAXB\com"
。xjc student.dtd -dtd
E:/JAXB/generated/Student.java
,此外还有其他的一些文件。xjc student.xsd grade.xsd
使用的XML文件相当简单book.xml
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<book>
<id>00011</id>
<name>Math</name>
<price>25.0</price>
<desc>required</desc>
</book>
利用Trang
生成的 schema 文件book.xsd
,参见上一节。
<?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:element ref="desc"/>
</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:element name="desc" type="xs:NCName"/>
</xs:schema>
利用 xjc
生成的 Java 文件(我在中文环境下,生成的注释为中文)。为了保证演示代码的完整性,我没有对代码片段做删减。
//
// 此文件是由 JavaTM Architecture for XML Binding (JAXB) 引用实现 v2.2.8-b130911.1802 生成的
// 请访问 <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 2018.08.26 时间 09:16:10 PM CST
//
package generated;
import java.math.BigDecimal;
import java.math.BigInteger;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
/** * <p>anonymous complex type的 Java 类。 * * <p>以下模式片段指定包含在此类中的预期内容。 * * <pre> * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element ref="{}id"/> * <element ref="{}name"/> * <element ref="{}price"/> * <element ref="{}desc"/> * </sequence> * </restriction> * </complexContent> * </complexType> * </pre> * * */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"id",
"name",
"price",
"desc"
})
@XmlRootElement(name = "book")
public class Book {
@XmlElement(required = true)
protected BigInteger id;
@XmlElement(required = true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String name;
@XmlElement(required = true)
protected BigDecimal price;
@XmlElement(required = true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String desc;
/** * 获取id属性的值。 * * @return * possible object is * {@link BigInteger } * */
public BigInteger getId() {
return id;
}
/** * 设置id属性的值。 * * @param value * allowed object is * {@link BigInteger } * */
public void setId(BigInteger value) {
this.id = value;
}
/** * 获取name属性的值。 * * @return * possible object is * {@link String } * */
public String getName() {
return name;
}
/** * 设置name属性的值。 * * @param value * allowed object is * {@link String } * */
public void setName(String value) {
this.name = value;
}
/** * 获取price属性的值。 * * @return * possible object is * {@link BigDecimal } * */
public BigDecimal getPrice() {
return price;
}
/** * 设置price属性的值。 * * @param value * allowed object is * {@link BigDecimal } * */
public void setPrice(BigDecimal value) {
this.price = value;
}
/** * 获取desc属性的值。 * * @return * possible object is * {@link String } * */
public String getDesc() {
return desc;
}
/** * 设置desc属性的值。 * * @param value * allowed object is * {@link String } * */
public void setDesc(String value) {
this.desc = value;
}
}
利用 schema 转换 java bean 不算很难,在真实的业务场景下也比较少见,之后还是会关注与基于注解的方式来转换 Java 与 XML。下一节将专注于JAXBContext
这个基础类。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://jiangchao.blog.csdn.net/article/details/82085109
内容来源于网络,如有侵权,请联系作者删除!