我的供应商为我提供了一个XSD,其元素定义为String。但是在他的说明中,他指出此字符串只能具有3个值中的1个:

例如:

<xs:complexType name="MitigationStatus">
  <xs:annotation>
    <xs:documentation>
      This represents a list of mitigation statuses.  Can be OPEN, CLOSED, INVALID
    </xs:documentation>
  </xs:annotation>
  <xs:sequence>
    <xs:element name="status" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
  </xs:sequence>
</xs:complexType>


我想在绑定文件中添加一些内容,以便在解组XML时,状态不是String而是Enum

我发现的所有文档似乎都表明XSD要求Stringenum类型。

即使Enum不是XSD,是否可以将字符串绑定到enum类型?

最佳答案

您可以在XML模式中定义此限制,并通过下面指示的更改对其进行稍微修改,然后从中生成Java类。

 <xs:simpleType name="StatusType">
   <xs:restriction base="xs:string">
     <xs:enumeration value="OPEN"/>
     <xs:enumeration value="CLOSED"/>
     <xs:enumeration value="INVALID"/>
   </xs:restriction>
 </xs:simpleType>

...
  <xs:element name="status" minOccurs="0" maxOccurs="unbounded" type="StatusType"/>
...


这将导致枚举类StatusType。在XML中,无论如何一切都是字符串,因此它保持原样。

如果您确实想通过绑定文件来执行此操作,则可以使用以下内容:

<jaxb:bindings node="//xsd:complexType[@name='MitigationStatus']">
  <jaxb:bindings node="./xsd:element[@name='status']">
    <jaxb:property>
      <jaxb:baseType>
        <jaxb:javaType name="StatusImpl"
                       parseMethod="StatusImpl.parseStringToEnum"
                       printMethod="StatusImpl.printEnumToString"/>
      </jaxb:baseType>
    </jaxb:property>
  </jaxb:bindings>
</jaxb:bindings>


假设一个枚举StatusType,类StatusImpl就是

public class StatusImpl {
    public static StatusType parseStringToEnum( String value ){
        return StatusType.valueOf( value );
    }
    public static String printEnumToString( StatusType impl ){
        return impl.toString();
    }
}

07-25 21:38
查看更多