Java JAXB:将元素类型xs:string绑定到枚举
我的供应商向我提供了一个Java JAXB:将元素类型xs:string绑定到枚举,java,xml,enums,jaxb,Java,Xml,Enums,Jaxb,我的供应商向我提供了一个XSD,它的元素定义为字符串。但是在他的规范中,他指出该字符串只能有3个值中的1个: 例: 这表示缓解状态列表。可以是打开的、关闭的、无效的 我想在绑定文件中添加一些内容,以便在我解组XML时,状态不是字符串,而是枚举 我找到的所有文档似乎都表明XSD要求字符串为enum类型 是否有一种方法可以将字符串绑定到Enum类型,即使XSD不是Enum?您可以在XML模式中定义此限制,并根据下面指示的更改进行轻微修改,然后从中生成Java类 <xs:simpleTyp
XSD
,它的元素定义为字符串
。但是在他的规范中,他指出该字符串只能有3个值中的1个:
例:
这表示缓解状态列表。可以是打开的、关闭的、无效的
我想在绑定文件中添加一些内容,以便在我解组XML
时,状态不是字符串
,而是枚举
我找到的所有文档似乎都表明XSD
要求字符串
为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"/>
...
我不知道你有什么问题,但下面的方法很好。如您所见,没有XSD,只有手动编码的JAXB类
public class Test {
public static void main(String[] args) throws Exception {
String xml = "<Path>\r\n" +
" <Direction>North</Direction>\r\n" +
" <Direction>North</Direction>\r\n" +
" <Direction>East</Direction>\r\n" +
" <Direction>South</Direction>\r\n" +
"</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<>();
}
在你写“我不知道你有什么问题”的时候回答这个问题听起来有点滑稽。另外,请注意,OP显式请求添加到绑定文件中。
<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>
public class StatusImpl {
public static StatusType parseStringToEnum( String value ){
return StatusType.valueOf( value );
}
public static String printEnumToString( StatusType impl ){
return impl.toString();
}
}
public class Test {
public static void main(String[] args) throws Exception {
String xml = "<Path>\r\n" +
" <Direction>North</Direction>\r\n" +
" <Direction>North</Direction>\r\n" +
" <Direction>East</Direction>\r\n" +
" <Direction>South</Direction>\r\n" +
"</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<>();
}