JAXB:将元素类型xs:string绑定到Enum



我的供应商为我提供了一个具有定义为String的元素的XSD。然而,在他的规范中,他指出这个字符串只能有3个值中的一个:

,

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

假设枚举类型为statusstype,类StatusImpl只是

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

我不知道你有什么问题,但以下工作很好。如您所见,这里没有XSD,只有手工编码的JAXB类。

public class Test {
    public static void main(String[] args) throws Exception {
        String xml = "<Path>rn" +
                     "  <Direction>North</Direction>rn" +
                     "  <Direction>North</Direction>rn" +
                     "  <Direction>East</Direction>rn" +
                     "  <Direction>South</Direction>rn" +
                     "</Path>";
        JAXBContext jaxbContext = JAXBContext.newInstance(Path.class);
        Path path = (Path)jaxbContext.createUnmarshaller().unmarshal(new StringReader(xml));
        for (Direction dir : path.directions)
            System.out.println(dir);
    }
}
@XmlEnum
enum Direction {
    @XmlEnumValue("North") NORTH,
    @XmlEnumValue("South") SOUTH,
    @XmlEnumValue("East")  EAST,
    @XmlEnumValue("West")  WEST
}
@XmlRootElement(name = "Path")
class Path {
    @XmlElement(name = "Direction")
    List<Direction> directions = new ArrayList<>();
}
输出

NORTH
NORTH
EAST
SOUTH

最新更新