当通过XJC编译器从XSD生成Java时,我总是得到具有匿名simpleTypes的元素的类型java.lang.String,如下所示:
<xsd:element name="Product">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Product1"/>
<xsd:enumeration value="Product2"/>
<xsd:enumeration value="Product3"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)
当然,我想要一个枚举.有没有办法欺骗XJC生成和使用一个?
我们正在使用JAXB 2.1.3.注意:在你问之前,不,我不能改变架构并使其适应XJC的错误.
Han*_*örr 15
你必须把你的XJC文件:
<jxb:bindings node="//xsd:element[@name='Product']/xsd:simpleType">
<jxb:typesafeEnumClass name="ProductType" />
</jxb:bindings>
Run Code Online (Sandbox Code Playgroud)
要么
<jxb:bindings node="//xsd:element[@name='Produkt']">
<jxb:bindings node="./xsd:simpleType">
<jxb:typesafeEnumClass name="ProduktType" />
</jxb:bindings>
</jxb:bindings>
Run Code Online (Sandbox Code Playgroud)
这是我如何实现这个的一个例子.我将添加整个xjb以获得完整性,因为我承认在查看现有示例时我仍然觉得它有点令人困惑.
这是.xjb文件
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
jaxb:version="1.0">
<jaxb:bindings schemaLocation="search-constraints.xsd"
node="/xs:schema">
<jaxb:bindings node="//xs:simpleType[@name='booleanStringType']">
<jaxb:typesafeEnumClass name="BooleanStringType" />
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)
这里,绑定指的是我在search-constraints.xsd中在根级别声明的简单类型.以下是该文件的摘录:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com"
xmlns:tns="http://www.example.com"
elementFormDefault="qualified"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0">
...
<xs:simpleType name="booleanStringType">
<xs:restriction base="xs:string">
<xs:enumeration value="true" />
<xs:enumeration value="false" />
</xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)