【发布时间】:2013-05-29 13:52:41
【问题描述】:
我有一堆 xsd 模式,其中一些模式导入其他模式。因此,每当我在某些导入其他文件的 xsd 文件上调用 xjc(Ant 任务或命令行工具)时,我都会传递一个绑定文件以确保不会再次生成导入的类(因为它们已经为“上行”模式生成)。此解决方案在this SO post (answer by 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
因此为导入的架构生成了文件。由于我们不希望这样,我们定义了以下绑定文件来传递:
imported-bindings.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>
HOWEVER 当我们使用 -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“资源类型”。有什么想法吗?
更新 除了使用自动生成的 episode 文件
的解决方法外,我还没有让它工作【问题讨论】: