如何从Java类生成XSD
在最近的几篇文章中,我们了解了Java JAXB以及如何从XSD生成Java类。
今天,我们将学习如何从Java类生成XSD。
从Java类生成XSD
我们将在maven项目中使用JAXB-2 Maven插件从Java类生成XSD。
JAXB2 Maven插件使用JAXB SchemaGenerator实用程序从Java类生成XSD。
Java类应具有此插件要使用的JAXB批注。
所需的最低Java版本是Java 5
首先创建一个新的Maven项目,您可以提供所需的任何名称,组ID和工件ID。
一旦我们构建了项目,它将在target/generation-resources/schemagen
目录中生成XSD类。
构建后,我们的项目结构将如下图所示。
这是我们拥有的最终pom.xml
文件:
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jaxb-schemagen</groupId> <artifactId>jaxb-schemagen</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.1</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>1.5</version> <executions> <execution> <id>schemagen</id> <goals> <goal>schemagen</goal> </goals> </execution> </executions> <configuration> <transformSchemas> <transformSchema> <uri>https://www.example.org/employee</uri> <toPrefix>empns</toPrefix> <toFile>employee.xsd</toFile> </transformSchema> <transformSchema> <uri>https://www.example.org/address</uri> <toPrefix>addrns</toPrefix> <toFile>address.xsd</toFile> </transformSchema> </transformSchemas> <includes> <include>com/theitroad/bean/*</include> </includes> <verbose>true</verbose> </configuration> </plugin> </plugins> </build> </project>
值得注意的是" jaxb"依赖项," schemagen"执行目标和" transformSchema"配置。
transformSchema配置用于指定生成的XSD文件名和要在XSD文件中使用的名称空间前缀。
这是我们将用于生成XSD的Java类。
Employee.java
package com.theitroad.bean; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlType; @XmlType(namespace = "https://www.example.org/employee") public class Employee { private String name; private int id; private String role; private Address address; public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlAttribute public int getId() { return id; } public void setId(int id) { this.id = id; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
注意带有类别名称空间的XmlType注释和用于字段ID的XmlAttribute注释。
一旦我们构建项目,该类将生成employee.xsd
模式。
如您所见,它具有另一个自定义类的Address字段,因此我们还需要注释该类以成功生成模式。
这是带有jaxb批注的地址类。
Address.java
package com.theitroad.bean; import javax.xml.bind.annotation.XmlType; @XmlType(namespace = "https://www.example.org/address") public class Address { private String city; private int zip; private String addressLine1; private String addressLine2; public String getCity() { return city; } public void setCity(String city) { this.city = city; } public int getZip() { return zip; } public void setZip(int zip) { this.zip = zip; } public String getAddressLine1() { return addressLine1; } public void setAddressLine1(String addressLine1) { this.addressLine1 = addressLine1; } public String getAddressLine2() { return addressLine2; } public void setAddressLine2(String addressLine2) { this.addressLine2 = addressLine2; } }
该类将生成address.xsd,因为其名称在pom.xml文件的transformSchema中匹配。
我们的项目设置已准备就绪,只需使用命令" mvn clean install"构建项目,然后将生成XSD文件。
对于我的项目,生成的XSD文件如下。
employee.xsd
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema xmlns:xs="https://www.w3.org/2001/XMLSchema" xmlns:addrns="https://www.example.org/address" targetNamespace="https://www.example.org/employee" version="1.0"> <xs:import namespace="https://www.example.org/address" schemaLocation="address.xsd" <xs:complexType name="employee"> <xs:sequence> <xs:element minOccurs="0" name="address" type="ns1:address" <xs:element minOccurs="0" name="name" type="xs:string" <xs:element minOccurs="0" name="role" type="xs:string" </xs:sequence> <xs:attribute name="id" type="xs:int" use="required" </xs:complexType> </xs:schema>
地址.xsd
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema xmlns:xs="https://www.w3.org/2001/XMLSchema" targetNamespace="https://www.example.org/address" version="1.0"> <xs:complexType name="address"> <xs:sequence> <xs:element minOccurs="0" name="addressLine1" type="xs:string" <xs:element minOccurs="0" name="addressLine2" type="xs:string" <xs:element minOccurs="0" name="city" type="xs:string" <xs:element name="zip" type="xs:int" </xs:sequence> </xs:complexType> </xs:schema>