代码之家  ›  专栏  ›  技术社区  ›  Dr. Hans-Peter Störr

JAXB:匿名简单类型作为枚举?

  •  10
  • Dr. Hans-Peter Störr  · 技术社区  · 15 年前

    当通过XJC编译器从XSD生成Java时,我总是得到JavaLang.Stand的元素,这些元素具有匿名单纯形:

        <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的错误。

    3 回复  |  直到 7 年前
        1
  •  15
  •   Dr. Hans-Peter Störr    15 年前

    您必须将其放入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>
    
        2
  •  5
  •   Kristofer    14 年前

    下面是我如何实现这个的一个例子。为了完整性,我将添加整个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>
    

        3
  •  1
  •   Jason S    9 年前

    我有一个非常相似的问题,我在JAXB邮件列表上问过 this fairly helpful response (不过还没来得及试一试)

    编辑:如果你在谈论 自动生成 EnUM类,而不仅仅是自动映射到您自己编写的EnUM类,我想您可以编写一个Java类,它将解析该模式文件并自动生成该枚举的Java代码。(然后在调用XJC时运行该Java类)