使用 JAXB schemagen 工具从 Java 类生成 XML 模式文件
使用 Java™ XML 绑定体系结构 (JAXB) schemagen 工具从 Java 类生成 XML 模式文件。
准备工作
有关此任务
使用 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 文档以进行编组和解组所需的所有必要信息。
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 类型。
示例
- 将以下
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
- 将生成 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 命令的更多信息。