JAXB 深入显出 - JAXB 教程 利用 xjc 将schema 文件转化为 Java bean

x33g5p2x  于2021-12-28 转载在 其他  
字(5.1k)|赞(0)|评价(0)|浏览(283)

摘要: JAXB 作为JDK的一部分,能便捷地将Java对象与XML进行相互转换,本教程从实际案例出发来讲解JAXB 2 的那些事儿。完整版目录

课前导读

JAXB 支持两种方式的XML与Java Bean 相互转化,之前介绍过基于注解的方式,这节介绍另一种方式 xjcxjc属于jdk 的命令行工具,用于将schema文件生成java实体类。
在上一节中,我们已经得到了 schema 文件,现在的主要任务是将 schema 转换为 Java bean。
演示基于 Windows 7 + jdk 8

xjc 演示

找到生成好的 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 命令

上例中,演示的是最简单的命令,使用了很多默认参数,实际上xjc支持的参数非常多,列举常用的几个参数及其含义。

参数取值含义
-bfile/dir指定其他的binding 文件 或文件夹
-ddir,默认为generated生成的文件存放在该文件夹下
-ppkg,默认为generated生成的Java文件使用的包名
-xmlschema默认指定输入为W3C XML Schema
-relaxng指定输入为 RELAX NG
-relaxng-compact指定输入为 RELAX NG compact
dtd指定输入为 XML DTD
-version查看 xjc 的版本
  1. 指定生成的 java 文件的包名:
    xjc -p com.traing.bean book.xsd
    可以在生成的文件E:/JAXB/com/traing/book/Book.java中发现指定的包名。
    package com.traing.bean;
  2. 指定生成的 java 文件路径:
    xjc book.xsd -d e:\JAXB\com
    可以发现生成的文件位于E:/JAXB/com/Book.java,值得注意的是,这里的e:\JAXB\com必须是一个存在的文件夹,否则不成功,错误提示拒绝写入不存在的目录 "e:\JAXB\com"
  3. 将其他格式的 schema 转化为Java对象:
    xjc student.dtd -dtd
    可以发现生成的文件E:/JAXB/generated/Student.java,此外还有其他的一些文件。

  1. 一次性指定多个需要转换 schema 文件:
    xjc student.xsd grade.xsd
    不用一个个转换了,可以指定多个schema文件,不过两个 schema 文件不能有重复的属性。

成果展示

使用的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> * &lt;complexType> * &lt;complexContent> * &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * &lt;sequence> * &lt;element ref="{}id"/> * &lt;element ref="{}name"/> * &lt;element ref="{}price"/> * &lt;element ref="{}desc"/> * &lt;/sequence> * &lt;/restriction> * &lt;/complexContent> * &lt;/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这个基础类。

相关文章