使用 JAXB schemagen 工具根据 Java 类生成 XML 模式文件
使用 Java™ XML 绑定体系结构 (JAXB) schemagen 工具根据 Java 类生成 XML 模式文件。
开始之前
关于此任务
使用 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 文档以进行编组和取消编组所需的所有必需信息。



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。

- 提供一个具有 @XmlSchema 的 package-info.java 文件;例如:
schemagen sample.Address sample\package-info.java
- 使用 @XmlType 注释名称空间属性来指定名称空间;例如:
@XmlType(namespace="http://myNameSpace")
过程
结果
既然已根据 Java 类生成 XML 模式文件,那么可以将 Java 对象作为 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 类型。gotcha示例
- 将以下 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; } }
- 打开命令提示符。
- 从复制 Bookdata.java 文件的目录中运行 schemagen 模式生成器工具。
app_server_root\bin\schemagen.bat Bookdata.java
app_server_root/bin/schemagen.sh Bookdata.java
app_server_root/bin/schemagen Bookdata.java
- 将生成 XML 模式文件 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: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 命令的更多信息。