如何使用 XJC 影响 class 组声明的生成
How to influence class generation of group declarations with XJC
我们有以下问题。我们尝试从包含组声明和对这些组声明的多个组引用的 XSD 文件生成 Java 代码。这里有一个简化版本:
<xs:group name="Information">
<xs:sequence>
<xs:element name="Name">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="updated" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<xs:element name="Address">
<xs:complexType>
<xs:sequence>
<xs:group ref="Information" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Customer">
<xs:complexType>
<xs:sequence>
<xs:group ref="Information"/>
</xs:sequence>
</xs:complexType>
</xs:element>
要点是:
- 这些元素中的每一个都在其自己的文件中定义
- 同一组
Information
被引用两次
- 组没有单独的类型
- 组内的
Name
元素也没有单独的类型
- 我们无法更改 XSD 文件
我们现在面临的问题是xjc生成非确定性取决于我们构建的机器,有时类型Address.Name
有时类型[=15] =],因为Name
元素是一个复杂类型,需要一个类型。
有没有办法让xjc总是生成相同的类型?
您可以尝试 -episode
command line option of XJC。它主要用于多步编译,但我认为它基本上是 "dumps decisions" XJC 在编译到(绑定)配置文件期间采用的。如果幸运的话,您会在剧集文件中找到与 Name
element/type 相关的合适设置,您可以将其复制到绑定配置文件中,以使 XJC 的行为具有确定性。
- 使用
jaxb:class
绑定自定义匿名复杂类型并指定 class 名称。
- 改为使用
<jaxb:globalBindings localScoping="toplevel"/>
在顶层生成内部 classes。
这两者的结合会给你一个可预测的class。
我们有以下问题。我们尝试从包含组声明和对这些组声明的多个组引用的 XSD 文件生成 Java 代码。这里有一个简化版本:
<xs:group name="Information">
<xs:sequence>
<xs:element name="Name">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="updated" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<xs:element name="Address">
<xs:complexType>
<xs:sequence>
<xs:group ref="Information" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Customer">
<xs:complexType>
<xs:sequence>
<xs:group ref="Information"/>
</xs:sequence>
</xs:complexType>
</xs:element>
要点是:
- 这些元素中的每一个都在其自己的文件中定义
- 同一组
Information
被引用两次 - 组没有单独的类型
- 组内的
Name
元素也没有单独的类型 - 我们无法更改 XSD 文件
我们现在面临的问题是xjc生成非确定性取决于我们构建的机器,有时类型Address.Name
有时类型[=15] =],因为Name
元素是一个复杂类型,需要一个类型。
有没有办法让xjc总是生成相同的类型?
您可以尝试 -episode
command line option of XJC。它主要用于多步编译,但我认为它基本上是 "dumps decisions" XJC 在编译到(绑定)配置文件期间采用的。如果幸运的话,您会在剧集文件中找到与 Name
element/type 相关的合适设置,您可以将其复制到绑定配置文件中,以使 XJC 的行为具有确定性。
- 使用
jaxb:class
绑定自定义匿名复杂类型并指定 class 名称。 - 改为使用
<jaxb:globalBindings localScoping="toplevel"/>
在顶层生成内部 classes。
这两者的结合会给你一个可预测的class。