11

当通过 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>

当然,我想要一个枚举。有没有办法欺骗 XJC 生成和使用一个?

我们正在使用 JAXB 2.1.3。注意:在您问之前,不,我无法更改架构并使其适应 XJC 的错误。

4

3 回答 3

16

您必须放入您的 XJC 文件:

<jxb:bindings node="//xsd:element[@name='Product']/xsd:simpleType">
    <jxb:typesafeEnumClass name="ProductType" />
</jxb:bindings>

或者

<jxb:bindings node="//xsd:element[@name='Produkt']">
    <jxb:bindings node="./xsd:simpleType">
        <jxb:typesafeEnumClass name="ProduktType" />
    </jxb:bindings>
</jxb:bindings>
于 2009-03-20T15:44:26.557 回答
5

这是我如何实现它的示例。为了完整起见,我将添加整个 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>

在这里,绑定指的是在我的 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>

于 2010-01-27T19:18:53.743 回答
1

我有一个非常相似的问题,我在 JAXB 邮件列表上询问并得到了这个相当有用的回复(虽然还没有时间尝试)

编辑:如果您正在谈论自动生成枚举类,而不仅仅是自动映射到您自己编写的枚举类,我认为您可以编写一个 java 类来解析模式文件并为此自动生成 java 代码枚举。(然后在调用 xjc 时运行该 java 类)

于 2009-02-25T14:58:53.817 回答