Elim的博客

用来记录一些原创性的总结


Elim

JAXB系列之schemagen生成schema文件

schemegen是JDK自带的一个工具,用来基于java或class文件生成对应的schema文件。对应的类可以通过JAXB注解来定义XML映射关系。我们先来看一个简单的示例,假设有如下这些java类需要用来生成schema文件。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "root")
public class RootObject {

    private String prop1;
    private String prop2;
    @XmlElementRef
    private SuperClass superClass;

    //省略get/set

}
public class SuperClass {

    private String superProp1;
    private String superProp2;
    
    //省略get/set
    
}
@XmlRootElement(name="sub1")
public class SubClass1 extends SuperClass {

    private String subProp1;
    private String subProp2;

    //省略get/set
}

@XmlRootElement(name="sub2")
public class SubClass2 extends SuperClass {

    private String subProp1;
    private String subProp2;

    //省略get/set
}

这些类都是放在com.elim.jaxb包下面的,所以在命令行窗口定位到源文件根路径,运行命令即可在当前目录生成一个schema1.xsd文件。因为我们在源文件里面没有指定schema,所以它们都将使用相同的默认schema,这时候生成的schema文件只有一个。如果我们在源文件中指定了多个不同的schema时,生成出来的也将有多个schema文件

schemagen com/elim/jaxb/*.java

生成出来的schema文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="root" type="rootObject"/>

  <xs:element name="sub1" type="subClass1"/>

  <xs:element name="sub2" type="subClass2"/>

  <xs:complexType name="rootObject">
    <xs:sequence>
      <xs:element name="prop1" type="xs:string" minOccurs="0"/>
      <xs:element name="prop2" type="xs:string" minOccurs="0"/>
      <xs:choice>
        <xs:element ref="sub1"/>
        <xs:element ref="sub2"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="superClass">
    <xs:sequence>
      <xs:element name="superProp1" type="xs:string" minOccurs="0"/>
      <xs:element name="superProp2" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="subClass1">
    <xs:complexContent>
      <xs:extension base="superClass">
        <xs:sequence>
          <xs:element name="subProp1" type="xs:string" minOccurs="0"/>
          <xs:element name="subProp2" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="subClass2">
    <xs:complexContent>
      <xs:extension base="superClass">
        <xs:sequence>
          <xs:element name="subProp1" type="xs:string" minOccurs="0"/>
          <xs:element name="subProp2" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

上面的示例也可以单独指定需要生成schema的java类:

schemagen com/elim/jaxb/RootObject.java com/elim/jaxb/SuperClass.java com/elim/jaxb/SubClass1.java com/elim/jaxb/SubClass2.java

除了基于Java源文件生成schema外,也可以基于编译好的class文件生成schema文件,只需要把后面的java文件替换为class即可,但对于class文件我们只需要确保它们在classpath下,并且指定对应的class名称即可,所以对于上述的示例,如果改为使用class文件生成schema,我们只需要定位到class文件根目录,运行如下指令即可。不需要单独指定SuperClass,因为它已经可以被RootObject关联到了。

schemagen com.elim.jaxb.RootObject com.elim.jaxb.SubClass1 com.elim.jaxb.SubClass2

不管是基于java文件还是基于class文件生成schema,都需要确保它们中应用的class都是在类路径下的。

以上只是一个简单的示例,接下来我们来看以下schemagen的语法,其语法如下:

schemagen [options] javafiles

其中的options支持以下选项,为保持原文语义,直接摘自官方文档