2012-04-05 62 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