Java 工具集教程

schemagen.exe 用于从 Java 生成 XML 模式

schemagen.exe 命令是 Java Development Kit (JDK) 提供的一个命令行工具,主要用于从 Java 类生成 XML 模式(XML Schema)文件。

该命令通过解析 Java 类的 JAXB 注解来生成对应的 XML 模式,这些模式描述了如何将 Java 对象映射到 XML 文档,以及如何将 XML 文档转换回 Java 对象。

什么是 JAXB?

JAXB 是一个允许 Java 开发人员将 Java 对象映射为 XML 表示的框架。它提供了将 Java 类映射到 XML 模式,以及将 XML 实例文档反向生成 Java 对象树的方法。

JAXB 支持两种主要的操作:

(1)将 Java 对象编组(marshal)为 XML

(2)将 XML 解组(unmarshal)为 Java 对象

JAXB 2.0 是 JDK 1.6 的组成部分。

JAXB 2.2.3 是 JDK 1.7 的组成部分。注意,从 JDK 11 开始,JAXB 已被移出 JDK 标准库,需要作为独立的库进行引入。

重要类和接口:

  • JAXBContext:应用的入口,用于管理 XML/Java 绑定信息。

  • Marshaller 接口:将 Java 对象序列化为 XML 数据。

  • Unmarshaller 接口:将 XML 数据反序列化为 Java 对象。

JAXB 通过注解来指示如何将 Java 类映射到 XML 元素、属性和其他结构。常用的注解包括:

  • @XmlRootElement:将 Java 类或枚举类型映射到 XML 元素。

  • @XmlElement:将 Java 类的一个属性映射到与属性同名的一个 XML 元素。

  • @XmlAttribute:将 Java 类的一个属性映射到与属性同名的一个 XML 属性。

  • @XmlAccessorType:控制字段或属性的序列化。

  • @XmlAccessorOrder:控制 JAXB 绑定类中属性和字段的排序。

  • @XmlJavaTypeAdapter:使用定制的适配器以序列化 Java 类为 XML。

使用场景

当你需要为 Java 类生成相应的 XML 模式(Schema)文件时,可以使用 schemagen.exe 命令。

这在数据交换、Web 服务(如 RESTful API)和消息传递等场景中非常有用,因为它允许你定义 Java 类和 XML 文档之间的映射关系。

命令语法

schemagen [-options ...] <java files>

命令选项

  • -d <path>  指定放置处理程序和 javac 生成的类文件的位置

  • -cp <path>  指定查找用户指定文件的位置

  • -classpath <path>  指定查找用户指定文件的位置

  • -encoding <encoding>  指定用于注释处理/javac 调用的编码

  • -episode <file>  生成片段文件以供单独编译

  • -version  显示版本信息

  • -fullversion  显示完整的版本信息

  • -help  显示此用法消息

命令示例

(1)基本用法:直接指定要生成 Schema 的 Java 文件路径。假设在当前目录下有一个名为 SchemagenDemo.java 的文件,可执行以下命令:

D:\share_dir\ShareDoc> schemagen SchemagenDemo.java

SchemagenDemo.java 文件内容如下:

import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

/**
 * 用于 schemagen 命令的示例代码
 * @author hxstrive.com
 */
public class SchemagenDemo {
    private List<Person> peoples;

    public List<Person> getPeoples() {
        return peoples;
    }

    public void setPeoples(List<Person> peoples) {
        this.peoples = peoples;
    }

    @XmlRootElement
    public static class Person {
        private String name;
        private int age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }

}

命令执行成功后,将在当前目录输出名为 schema1.xsd 的文件,该文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="person" type="person"/>

  <xs:complexType name="schemagenDemo">
    <xs:sequence>
      <xs:element name="peoples" type="person" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="person">
    <xs:sequence>
      <xs:element name="age" type="xs:int"/>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

(2)指定输出路径:使用 -d 选项指定生成的 XML Schema 文件的输出目录。例如,要将生成的文件输出到当前目录的 schemas 子目录下:

D:\share_dir\ShareDoc> schemagen -d schemas SchemagenDemo.java

执行上述命令后,如下图:

image.png

注意,如果当前目录下面没有 schemas 目录,则会出现“目录 "schemas" 不存在。”错误。

(3)处理引用了外部类的情况:如果要生成 Schema 的 Java 文件引用了外部类,需要使用 -cp(或 -classpath)选项指明寻找路径(注意路径中不包含包名)。假设有一个名为 MyComplexClass.java 的文件,它引用了外部类,外部类位于 D:\external_classes 目录下,则命令如下:

schemagen -d D:\schemas -cp D:\external_classes MyComplexClass.java

注意:使用 schemagen.exe 命令时,需要在命令行中进入到包含该工具的目录(通常是 JDK 的 bin 目录)。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号