2

我对 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> 
4

1 回答 1

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 类(我们称之为“人工 JAXB 类”)。

然后,您可以在较大的 XSD 上运行 xjc 并自定义生成以将这种类型用于特定元素。

或者,如果从这个外部 XSD 生成 JAXB 是一次性操作(然后您将 JAXB 生成的代码放在您的 SVN/Git 中),那么您可以重写该部分代码以使用您的“人工”而是 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>
于 2012-04-05T23:07:15.680 回答