2012-04-05 72 views
2

我对XJC工具有一个问题,它不会为使用此模式的属性myEnum生成Enum类。绑定-JAXB:XJC不生成属性的枚举类

<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> 

回答

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中),那么您可以重写该代码的部分以使用您的'人造'JAX​​B类型。

另一个你可能想尝试是让你的绑定定制

<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> 
+0

Thaank您的回答,但问题是,我必须在XSD文件(已经存在)有超过1500线 – 2012-04-06 08:53:20

+0

工作,你是说你不能改变的XSD(因此正在寻找仅XJC解决方案)?否则,你能解释为什么尺寸在这种情况下很重要吗?此外,我建议您提供有关您的特别设置的详细信息:特别是JDK和JAXB版本+实现。 – 2012-04-06 14:01:29

+1

是的,我无法更改XSD(来自其他供应商的XSD) 我使用JDK 6和JAXB 2.2,试图从xsd文件自动生成xml文件(填充随机数据)。谢谢 – 2012-04-06 14:16:56