我有一堆xsd模式,其中一些导入其他模式。因此,每当我在某些导入其他文件的xsd文件上调用xjc(Ant 任务或命令行工具)时,我都会传递一个绑定文件以确保不会再次生成导入的类(因为它们已经为“上行”模式)。此解决方案在此 SO 帖子(Blaise Doughan 的回答)中进行了描述。
虽然这种方法确实适用于xsd:complexType类型,但它似乎不适用于xsd:simpleType类型。这是一个缩小的例子来证明这一点。假设我们有两个非常简单的模式,一个导入另一个:
a.xsd ---import--> b.xsd
文件是:
a.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://example.a"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://example.b"
schemaLocation="b.xsd"/>
</xs:schema>
b.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://example.b"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:b="http://example.b"
elementFormDefault="qualified">
<xs:simpleType name="ResourceType">
<xs:restriction base="xs:string">
<xs:enumeration value="alpha"/>
<xs:enumeration value="beta"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ResourceType2">
<xs:sequence>
<xs:element name="a" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
所以基本上a.xsd什么都不做,只导入b.xsd。当在a.xsd上调用xjc时,如下所示:
xjc -d output -p example.a -npa a.xsd
你得到:
output/
└── example
└── a
├── ObjectFactory.java
├── ResourceType2.java
└── ResourceType.java
因此为导入的模式生成了文件。由于我们不希望这样,我们定义了以下绑定文件来传递:
导入的绑定.xml
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jxb:bindings schemaLocation="b.xsd">
<jxb:bindings node="//xs:simpleType[@name='ResourceType']">
<jxb:class ref="example.b.ResourceType"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name='ResourceType2']">
<jxb:class ref="example.b.ResourceType2"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
但是,当我们使用-b选项在a.xsd上再次调用xjc时,如下所示:
xjc -d output -p a.example a.xsd -b imported-bindings.xml
我们在输出目录中看到以下内容:
output/
└── example
└── a
├── ObjectFactory.java
└── ResourceType.java
也就是说,确实抑制了xsd:complexType "ResourceType2" 的生成,但是xjc继续为导入的xsd:simpleType "ResourceType" 生成代码。有任何想法吗?
更新 我仍然没有得到这个工作,除了使用自动生成的剧集文件的解决方法