如何从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>

