2015-12-15 120 views
4

枚舉我有類似下面的XSD:JAXB不會生成枚舉

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0"> 
    <xs:element name="foo"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="bar"> 
        <xs:complexType> 
         <xs:simpleContent> 
          <xs:extension base="xs:string"> 
           <xs:attribute name="type" use="required"> 
            <xs:simpleType> 
             <xs:restriction base="xs:string"> 
              <xs:enumeration value="a"/> 
              <xs:enumeration value="b"/> 
             </xs:restriction> 
            </xs:simpleType> 
           </xs:attribute> 
           <xs:attribute name="subtype" use="required"> 
            <xs:simpleType> 
             <xs:restriction base="xs:string"> 
              <xs:enumeration value="aa"/> 
              <xs:enumeration value="bb"/> 
              <xs:enumeration value="cc"/> 
              <xs:enumeration value="dd"/> 
              <xs:enumeration value="ee"/> 
              <xs:enumeration value="ff"/> 
             </xs:restriction> 
            </xs:simpleType> 
           </xs:attribute> 
          </xs:extension> 
         </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="something"> 
        <xs:complexType> 
         <xs:attribute name="name" type="xs:string" use="required"/> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

但JAXB不會產生枚舉:

@XmlAttribute(name = "type", required = true) 
    protected String type; 
    @XmlAttribute(name = "subtype", required = true) 
    protected String subtype; 

我使用maven-jaxb2-plugin生成JAXB類。

如何在這種情況下生成枚舉?爲什麼它不能立即使用?

請注意,我無法更改XML結構。我更喜歡自定義綁定解決方案(使用xjb文件),但我也可以更改XSD,只要它不更改XML結構。

+0

@LucaBassoRicci首先,它是一個屬性不是一個元素。其次,頂層元素有一些其他的語義(是一個有效的根元素)。 – Puce

回答

1

你的枚舉是一個內部的simpleType。改變你的XSD在

<xs:element name="foo"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="bar"> 
        <xs:complexType> 
         <xs:simpleContent> 
          <xs:extension base="xs:string"> 
           <xs:attribute name="type" use="required"> 
            <xs:simpleType> 
             <xs:restriction base="xs:string"> 
              <xs:enumeration value="a" /> 
              <xs:enumeration value="b" /> 
             </xs:restriction> 
            </xs:simpleType> 
           </xs:attribute> 
           <xs:attribute name="subtype" use="required" type="CodeEnum"/> 
          </xs:extension> 
         </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="something"> 
        <xs:complexType> 
         <xs:attribute name="name" type="xs:string" use="required" /> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:simpleType name="CodeEnum"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="aa" /> 
      <xs:enumeration value="bb" /> 
      <xs:enumeration value="cc" /> 
      <xs:enumeration value="dd" /> 
      <xs:enumeration value="ee" /> 
      <xs:enumeration value="ff" /> 
     </xs:restriction> 
    </xs:simpleType> 

注:該解決方案的XML將是相同的。

+0

謝謝,但我沒有嘗試,因爲我找到了使用綁定文件的解決方案,所以我不必更改XSD。 – Puce

2

感謝https://stackoverflow.com/a/666722/506855我設法定義了以下綁定文件,它的伎倆:

<?xml version="1.0" encoding="UTF-8"?> 
<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       version="2.1"> 

    <jxb:bindings schemaLocation="testError.xsd"> 
     <jxb:bindings node="//xs:attribute[@name='type']/xs:simpleType"> 
      <jxb:typesafeEnumClass name="Type" /> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:attribute[@name='subtype']/xs:simpleType"> 
      <jxb:typesafeEnumClass name="Subtype" /> 
     </jxb:bindings> 
    </jxb:bindings> 

</jxb:bindings> 

還有一個相關的(老)JAXB問題:https://java.net/jira/browse/JAXB-318