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

摘要: 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键,单机鼠标右键,在弹出的对话框中,选择在此处打开命令窗口,如下图:

JAXB 深入显出 - JAXB 教程 利用 xjc 将schema 文件转化为 Java bean_第1张图片
首先测试是否安装好 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


<book>
    <id>00011id>
    <name>Mathname>
    <price>25.0price>
    <desc>requireddesc>
book>

利用Trang生成的 schema 文件book.xsd,参见上一节。


<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 生成的
// 请访问 http://java.sun.com/xml/jaxb 
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 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;


/**
 * 

anonymous complex type的 Java 类。 * *

以下模式片段指定包含在此类中的预期内容。 * *

 * <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>
 * 
* * */
@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这个基础类。

你可能感兴趣的:(JAXB,JAXB,深入显出)