相关文章推荐

使用 Java™ XML 绑定体系结构 (JAXB) schemagen 工具从 Java 类生成 XML 模式文件。

准备工作

标识要映射到 XML 模式文件的 Java 类或一组 Java 对象。

有关此任务

使用 JAXB API 和工具在 Java 类和 XML 模式之间建立映射。 XML 模式文档描述了 XML 文档中的数据元素和关系。 在数据映射或绑定存在后,可以在 XML 文档与 Java 对象之间进行转换。 现在不必理解数据结构即可访问 XML 文档中存储的数据。

要使用从现有 JavaBeans 或企业 Bean 开始的自底向上开发方法来开发 Web Service ,请使用 wsgen 工具为 Java API for XML-Based Web Services (JAX-WS) 应用程序生成工件。 生成应用程序的 Java 工件后,可以使用 JAXB 模式生成器 schemagen 命令行工具从现有 Java 应用程序创建表示 Java 应用程序的数据元素的 XML 模式文档。 JAXB 模式生成器处理 Java 源文件或类文件。 Java 类注释提供了定制从现有 Java 类到生成的模式组件的缺省映射的功能。 XML 模式文件以及带注释的 Java 类文件包含 JAXB 运行时解析 XML 文档以进行编组和取消编组所需的所有必需信息。

您可以使用 JAXB 模式生成器 schemagen 命令行工具从表示 Java 应用程序的数据元素的现有 Java 应用程序创建 XML 模式文档。 JAXB 模式生成器处理 Java 源文件或类文件。 Java 类注释提供了定制从现有 Java 类到生成的模式组件的缺省映射的功能。 XML 模式文件以及带注释的 Java 类文件包含 JAXB 运行时解析 XML 文档以进行编组和取消编组所需的所有必需信息。

受支持的配置: wsimport wsgen schemagen xjc 命令行工具在 z/OS® 平台上不受支持。 此功能由在 z/OS 平台上运行的 WebSphere® Application Server 随附的组装工具提供。 请针对 JAX-WS 应用程序查看这些命令行工具,以更多地了解这些工具。
最佳实践: WebSphere Application Server 提供 Java API for XML-Based Web Services (JAX-WS) 和 Java XML 绑定体系结构 (JAXB) 工具。 wsimport wsgen schemagen xjc 命令行工具位于完整概要文件的 app_server_root \bin\ 目录中。 wsimport wsgen 命令位于 Liberty 概要文件中的 app_server_root \jaxws\bin\ 目录内。 xjc schemagen 命令位于 Liberty 概要文件中的 app_server_root \jaxb\bin\ 目录中。 Java SE Development Kit (JDK) 6 提供了类似的工具。 在某些情况下,由 WebSphere Application Server 和 JDK 提供的工具生成的工件支持相同的规范级别。 总之,JDK 工具生成的工件可在其他顺应的运行时环境之间移植。 但是,最佳实践是使用本产品随附的工具在 WebSphere Application Server 环境中实现无缝集成,并利用仅在 WebSphere Application Server中受支持的功能部件。 要利用 JAX-WS 和 JAXB V2.2 工具,请使用应用程序服务器附带提供的工具,这些工具位于 app_server_root \bin\ 目录。
支持的配置: 此产品支持 JAXB 2.2 规范。 JAX-WS 2.2 要求使用 JAXB 2.2 进行数据绑定。

JAXB 提供编译支持,让您可以配置 schemagen 模式生成者,以便它不会自动生成新的模式。 如果要使用公共模式(例如万维网联盟 (W3C)、XML 模式、Web 服务描述语言 (WSDL) 或 WS-Addressing)并且不想为引用的特定包生成新模式,那么此改进很有用。 @XmlSchema 注释上的 location 属性使 schemagen 生成者可以引用现有模式的 URI,而不是生成新的模式。

除了从命令行使用 schemagen 工具外,还可以从 Ant 构建环境中调用此 JAXB 工具。 从 Ant 构建环境中使用 com.sun.tools.jxc.SchemaGenTask Ant 任务来调用 schemagen 模式生成器工具。 为了使功能正常,此 Ant 任务需要您使用 ws_ant 脚本来调用 Ant。

避免麻烦: 运行 schemagen 工具时,模式生成器无法从 package-info 类文件正确读取 @XmlSchema 注释以派生 targetNamespaces。 请使用下列其中一种方法来取代使用 @XMLSchema 注释:
  • 提供一个具有 @XmlSchema 的 package-info.java 文件;例如:
    schemagen sample.Address sample\package-info.java
  • 使用 @XmlType 注释名称空间属性来指定名称空间;例如:
    @XmlType(namespace="http://myNameSpace")
  • 过程

    1. 找到要用于生成 XML 模式文件的 Java 源文件或 Java 类文件。
      确保 Java 类文件引用的所有类都包含在类路径中,或者使用 -classpath/-cp 选项提供给工具。
    2. 使用 JAXB 模式生成器 schemagen 命令来生成 XML 模式。
      模式生成器位于 app_server_root \bin\ 目录中。
      [Windows]
      app_server_root\bin\schemagen.bat myObj1.java myObj2.java
      [Linux] [AIX] [HP-UX] [Solaris]
      app_server_root/bin/schemagen.sh myObj1.java myObj2.java

      参数 myObj1.java myObj2.java 是包含数据对象的 Java 文件的名称。 如果 myObj1.java myObj2.java 引用未传递到 schemagen 命令中的 Java 类,那么必须使用 -cp 选项为这些 Java 类提供类路径位置。

      阅读 schemagen 命令以了解有关此命令的更多信息以及可以指定的其他选项。
    3. (可选) 使用 javax.xml.bind.annotations 包中定义的 JAXB 程序注释来定制 JAXB XML 模式映射。
    4. (可选) 配置 @XmlSchema 注释上的 location 属性,以指示模式编译器使用现有模式而不是生成新模式。
      例如,
      @XmlSchema(namespace="foo")
      package foo;
      @XmlType
      class Foo {
      @XmlElement Bar zot;
      @XmlSchema(namespace="bar",
      location="http://example.org/test.xsd")
      package bar;
      @XmlType
      class Bar {
      <xs:schema targetNamespace="foo">
      <xs:import namespace="bar"
      schemaLocation="http://example.org/test.xsd"/>
      <xs:complexType name="foo">
      <xs:sequence>
      <xs:element name="zot" type="bar:Bar" xmlns:bar="bar"/>
      </xs:sequence>
      </xs:complex
      location="http://example.org/test.xsd" schemagen 工具表示现有模式上的位置并且不会生成新的模式。
    5. 结果

      现在,您已从 Java 类生成 XML 模式文件,您已准备好将 Java 对象作为 XML 实例文档进行编组和取消编组。

      避免麻烦: schemagen 命令不会区分在不同 Java 包中定义了相同 @XMLType 名称的多个 @XMLType 注释之间的 XML 名称空间。 如果出现了这种情况,那么将产生以下错误:
      Error: Two classes have the same XML type name ....
      Use @XmlType.name and @XmlType.namespace to assign different names to them...
      此错误指示您具有具有相同名称但存在于不同 Java 包中的类名或 @XMLType.name 值。 要防止此错误,请将 @XML.Type.namespace 类添加至现有的 @XMLType 注释以区分 XML 类型。

      示例

      以下示例说明 JAXB 工具如何从现有 Java 类 Bookdata.java生成 XML 模式文件。
      1. 将以下 Bookdata.java 文件复制到临时目录。
        package generated;
        import javax.xml.bind.annotation.XmlAccessType;
        import javax.xml.bind.annotation.XmlAccessorType;
        import javax.xml.bind.annotation.XmlAttribute;
        import javax.xml.bind.annotation.XmlElement;
        import javax.xml.bind.annotation.XmlType;
        import javax.xml.datatype.XMLGregorianCalendar;
        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "bookdata", propOrder = {
            "author",
            "title",
            "genre",
            "price",
            "publishDate",
            "description"
        public class Bookdata {
            @XmlElement(required = true)
            protected String author;
            @XmlElement(required = true)
            protected String title;
            @XmlElement(required = true)
            protected String genre;
            protected float price;
            @XmlElement(name = "publish_date", required = true)
            protected XMLGregorianCalendar publishDate;
            @XmlElement(required = true)
            protected String description;
            @XmlAttribute
            protected String id;
             public String getAuthor() {
                return author;
            public void setAuthor(String value) {
                this.author = value;
            public String getTitle() {
                return title;
             public void setTitle(String value) {
                this.title = value;
            public String getGenre() {
                return genre;
            public void setGenre(String value) {
                this.genre = value;
            public float getPrice() {
                return price;
            public void setPrice(float value) {
                this.price = value;
            public XMLGregorianCalendar getPublishDate() {
                return publishDate;
            public void setPublishDate(XMLGregorianCalendar value) {
                this.publishDate = value;
            public String getDescription() {
                return description;
            public void setDescription(String value) {
                this.description = value;
            public String getId() {
                return id;
            public void setId(String value) {
                this.id = value;
        
      2. 打开命令提示符。
      3. 从复制 Bookdata.java 文件的目录中运行 schemagen 模式生成器工具。
        [Windows]
        app_server_root\bin\schemagen.bat Bookdata.java
        [Linux][AIX][HP-UX][Solaris]
        app_server_root/bin/schemagen.sh Bookdata.java 
      4. 将生成 XML 模式文件 schema1.xsd
        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <xs:schema version="1.0" xmlns:xs="https://www.w3.org/2001/XMLSchema">
          <xs:complexType name="bookdata">
            <xs:sequence>
              <xs:element name="author" type="xs:string"/>
              <xs:element name="title" type="xs:string"/>
              <xs:element name="genre" type="xs:string"/>
              <xs:element name="price" type="xs:float"/>
              <xs:element name="publish_date" type="xs:anySimpleType"/>
              <xs:element name="description" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:string"/>
          </xs:complexType>
        </xs:schema>
        
 
推荐文章