使用 JAXB schemagen 工具从 Java 类生成 XML 模式文件

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

准备工作

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

有关此任务

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

使用自下而上的开发方法从现有JavaBeans或企业 bean,使用wsgen工具来生成基于 XML 的 Web 服务的 Java API (JAX-WS) 应用程序的工件。 生成应用程序的 Java 工件后,可以使用 JAXB 模式生成器从现有 Java 应用程序创建 XML 模式文档,该文档表示 Java 应用程序的数据元素。schemagen命令行工具。 JAXB 模式生成器可以处理 Java 源文件或类文件。 Java 类注释提供了自定义从现有 Java 类到生成的模式组件的默认映射的功能。 XML 模式文件以及带注释的 Java 类文件包含 JAXB 运行时解析 XML 文档以进行编组和解组所需的所有必要信息。

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

支持的配置:wsimportwsgenschemagenxjc命令行工具不受支持z/OS®平台。 此功能由随附的组装工具提供WebSphere® Application Server运行于z/OS平台。 请针对 JAX-WS 应用程序查看这些命令行工具,以更多地了解这些工具。
最佳实践:WebSphere Application Server提供基于 XML 的 Web 服务的 Java API(JAX-WS)和用于 XML 绑定的 Java 架构(JAXB)工具。 wsimportwsgenschemagenxjc 命令行工具位于完整概要文件的 app_server_root\bin\ 目录中。 wsimportwsgen 命令位于 Liberty 概要文件中的 app_server_root\jaxws\bin\ 目录内。 这xjcschemagen命令位于应用程序服务器根目录Liberty 配置文件中的 \jaxb\bin\ 目录。 Java SE 开发工具包 (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工具,架构生成器无法正确读取@XmlSchema从 package-info 类文件中导出注释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 模式。
    模式生成器位于应用程序服务器根目录\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.javamyObj2.java,是包含数据对象的 Java 文件的名称。 如果myObj1.java或者myObj2.java引用未传递到schemagen命令,您必须使用-cp选项来为这些 Java 类提供类路径位置。

    阅读 schemagen 命令以了解有关此命令的更多信息以及可以指定的其他选项。
  3. (可选)使用 JAXB 程序注释中定义的javax.xml.bind.annotations包来定制 JAXB XML 模式映射。
  4. (可选)配置location财产@XmlSchema注释指示模式编译器使用现有模式而不是生成新的模式。
    例如
    @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 工具表示现有模式上的位置并且不会生成新的模式。

结果

现在您已经从 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...
此错误表明您有类名或@XMLType.name具有相同名称但存在于不同 Java 包中的值。 要防止此错误,请将 @XML.Type.namespace 类添加至现有的 @XMLType 注释以区分 XML 类型。

示例

以下示例说明了 JAXB 工具如何从现有 Java 类生成 XML 模式文件,Bookdata.java 。
  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>
    

请参阅 JAXB 引用实现文档以获取有关 schemagen 命令的更多信息。