我遇到了从深层嵌套的xsd元素生成枚举的问题。当我在maven构建期间生成代码时,我的枚举是string类型。这是一个例子。
<xs:element name="Car">
<xs:complexType>
<xs:sequence>
<xs:element name="CarModal">
<xs:complexType>
<xs:sequence>
<xs:element name="Type">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="SomeValue"/>
<xs:enumeration value="AnotherValue"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:completType>
</xs:element>
</xs:sequence>
从上面的例子中我们将在Car元素中包含另外20个元素,其中包含枚举值名称“Type”。我有一个绑定文件绑定'类型'到jaxb:typesafeEnumClass但它不工作,我仍然得到字符串作为我的枚举类型。这是我绑定的一个例子。
<jaxb:bindings schemaLocation="someLocation">
<jaxb:bindings node="//xs:element[@name='Car']>
<jaxb:bindings node="//xs:element[@name='CarModal']">
<jaxb:bindings node="xs:element[@name='Type']/xs:simpleType>
<jaxb:typesafeEnumClass name="Type"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
感谢您的帮助,我无法更改xsd
我猜你的绑定也不够精确。当你写//xs:element[@name='CarModal']
时,你基本上会说“我的架构中的任何CarModal
元素”。接下来,你说你有很多Type
元素所以xs:element[@name='Type']/xs:simpleType
不够精确。
尝试更精确的表达式
xs:complexType/xs:sequence/xs:element[@name='CarModal']/
xs:complexType/xs:sequence/xs:element[@name='Type']/xs:simpleType
接下来,您的绑定会对错误的语法产生一般印象。例如:
<jaxb:bindings node="xs:element[@name='Type']/xs:simpleType>
是无效的XML(在"
之后缺少xs:simpleType
)。因此可能会出现根本不考虑绑定的情况 - 否则您应该得到错误而不是生成的代码。仔细检查是否完全应用了绑定。