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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangchao858/article/details/82085109

摘要: 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支持的参数非常多,列举常用的几个参数及其含义。

参数 取值 含义
-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 的版本
  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,此外还有其他的一些文件。
    这里写图片描述
  4. 一次性指定多个需要转换 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这个基础类。

猜你喜欢

转载自blog.csdn.net/jiangchao858/article/details/82085109