我的供应商为我提供了一个具有定义为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
需要String
为enum
类型。
是否有办法将字符串绑定到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