我对XJC工具有一个问题,即它没有使用此模式为属性myEnum生成Enum类。
<xs:element name="myClass">
<xs:complexType>
<xs:attribute name="myEnum" >
<xs:simpleType >
<xs:restriction base="xs:string">
<xs:maxLength value="1"/>
<xs:enumeration value="C"/>
<xs:enumeration value="M"/>
<xs:enumeration value="S"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
但如果我只使用此
,则会生成它<xs:simpleType >
<xs:restriction base="xs:string">
<xs:maxLength value="1"/>
<xs:enumeration value="C"/>
<xs:enumeration value="M"/>
<xs:enumeration value="S"/>
</xs:restriction>
</xs:simpleType>
这是外部绑定文件内容:
<?xml version="1.0" encoding="UTF-8" ?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
version="2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<globalBindings typesafeEnumMemberName="generateName">
</globalBindings>
</bindings>
答案 0 :(得分:2)
您可以尝试这样做:定义一个小的XSD文件,只使用声明为全局类型的特定类型,例如:
<xs:simpleType name="myEnumSimpleType">
<xs:restriction base="xs:string">
<xs:maxLength value="1"/>
<xs:enumeration value="C"/>
<xs:enumeration value="M"/>
<xs:enumeration value="S"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="myClass">
<xs:complexType>
<xs:attribute name="myEnum" type="myEnumSimpleType">
</xs:complexType>
</xs:element>
这将生成一个JAXB类(让我们称之为&#39;人工JAXB类)。
然后,您可以在较大的XSD上运行xjc并自定义生成,以便为特定元素使用此类型。
或者,如果来自此外部XSD的JAXB生成是一次性操作(然后您将JAXB生成的代码放在SVN / Git中),那么您可以重写该代码的一部分以使用您的&#39;人工&#39;而是JAXB类型。
您可能想要尝试的另一种方法是进行绑定自定义
<globalBindings typesafeEnumMemberName="generateName">
不是全局的,但是使用表达式试图在这种类型上完全确定它。 JAXB可能会为每次出现生成一个新类,即使它们将是相同的。
因为我觉得xpath很乏味,所以我会在那个用命名空间修改的大XSD的本地副本上快速测试它,例如:
<xs:element name="myClass">
<xs:complexType>
<xs:attribute name="myEnum" >
<xs:simpleType >
<xs:annotation>
<xs:appinfo>
<jaxb:typesafeEnumClass/>
</xs:appinfo>
</xs:annotation> <xs:restriction base="xs:string">
<xs:maxLength value="1"/>
<xs:enumeration value="C"/>
<xs:enumeration value="M"/>
<xs:enumeration value="S"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>