我有如下的XSD:
<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 :(得分: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
答案 1 :(得分:1)
你的枚举是内在的simpleType
。在
<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将是相同的。