gpt4 book ai didi

java - XJC 不在 xs :union 内生成枚举

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:10 25 4
gpt4 key购买 nike

我有几个包含如下结构的 XSD 文件:

<xs:complexType name="SomeThing" abstract="false">
<xs:sequence>
<xs:element name="id" type="schema2:SomeIdTypeClass" minOccurs="1" maxOccurs="1"/>
<xs:element name="myType" type="schema1:MyType" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>

<xs:simpleType name="MyType">
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="APPLE"/>
<xs:enumeration value="ORANGE"/>
<xs:enumeration value="BANANA"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="OTHER:[a-zA-Z_][a-zA-Z0-9_]*"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>

我正在使用 XJC 命令在控制台上生成 Java 类,而不是 Maven 或 Ant 或任何其他构建工具。

除了这些类型的枚举之外,所有类似乎都可以正常生成。使用枚举类型的类仅将其引用为字符串,例如Something 类只包含 MyType 作为字符串,而不是像我期望的那样作为 ENUM。

在另一个文件中,我有类似这样的内容,其中生成的枚举没有问题,并且引用类按应有的方式将其用作枚举。

<xs:simpleType name="SizeType">
<xs:restriction base="xs:string">
<xs:enumeration value="SMALL"/>
<xs:enumeration value="MEDIUM"/>
<xs:enumeration value="LARGE"/>
</xs:restriction>

我不想替换 XSD 文件,因为它们不是我自己生成的,而且我有几个文件包含其中的许多元素。

我得出的结论是我需要使用某种 XJB 绑定(bind)文件,但我不知道我到底需要在那里写什么:

下面只给我报错“results in too many target nodes”

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc">
<jaxb:bindings schemaLocation="MySchema.xsd" node="/xs:schema">
<jaxb:bindings node="//xs:simpleType[@name='MyType']/xs:union/xs:simpleType">
<jaxb:typesafeEnumClass name="MyType"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>

添加 multiple="true" 解决了这个问题,但仍然没有给我想要的枚举。

编辑:当我删除 xs:union 以便我有一个像这样的正常 xs:simpleType 时:

<xs:simpleType name="MyType">
<xs:restriction base="xs:string">
<xs:pattern value="OTHER:[a-zA-Z_][a-zA-Z0-9_]*"/>
<xs:enumeration value="APPLE"/>
<xs:enumeration value="ORANGE"/>
<xs:enumeration value="BANANA"/>
</xs:restriction>
</xs:simpleType>

然后它按预期工作。如果不需要的话,我仍然不想走那条路并编辑模式。一定有办法解决。

最佳答案

好的,我已经在这个主题上花了一些时间,我在谷歌上搜索了很多并做了一些测试。

简答:不可能

详细答案:

This question关于 SO 是关于一个有同样问题但更简单的人:他有一个 union包含单个 simpleType (一个 restriction 和一些 enumeration ),这很奇怪,因为 union毫无意义,但无论如何。

所以这家伙被卡住了 this answer很有趣:

It looks like unions are not well supported https://jaxb.java.net/tutorial/section_2_2_10-Defining-a-Type-Union.html

If you could modify the schema you could extract the enumerated anonymous simple type to a named type and then use in your code the Java enum generated for this new type....

没有得到很好的支持...但不如“完全没有”或“在某些情况下”那样好?

不幸的是,链接已断开,但感谢我们的 friend The Internet Archive , I pulled out我需要的信息:

In Java, there is no convenient way of expressing unions of simple types. The JAXB compiler simply inserts Java's String type wherever the union type is used and leaves it up to the application programmer to handle the rest. Try to avoid xsd:union.

这就是路的尽头,你被困住了。只要union存在于您的模式中,没有 emum将生成类并且String将始终被选为默认类型。

此外,我找到了这篇文章,Extend enumerated lists in XML schema .在一些解决方案中,作者提倡使用union但最终说:

Requires <xsd:union> tag support, which is sometimes not implemented in tools

最后,最好的解决方案可能是文章中的第一个:编辑原始架构以包含新的枚举值

关于java - XJC 不在 xs :union 内生成枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37281539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com