2

我有一堆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" 生成代码。有任何想法吗?

更新 我仍然没有得到这个工作,除了使用自动生成的剧集文件的解决方法

4

1 回答 1

-1

JAXB 2.2.x 版本只支持我猜。

于 2013-12-10T11:08:46.550 回答