【问题标题】:Generate enum from deeply nested xsd elements从深度嵌套的 xsd 元素生成枚举
【发布时间】:2017-12-27 17:28:44
【问题描述】:

我在从深度嵌套的 xsd 元素生成枚举时遇到问题。当我在 Maven 构建期间生成代码时,我的枚举是字符串类型。这是一个例子。

 <xs:element name="Car">
 <xs:complexType>
  <xs:sequence>
     <xs:element name="CarModal">
        <xs:complexType>
         <xs:sequence>
             <xs:element name="Type">
               <xs:simpleType>
                  <xs:restriction base="xs:string">
                     <xs:enumeration value="SomeValue"/>
                     <xs:enumeration value="AnotherValue"/>
                  </xs:restriction>
               </xs:simpleType>
             </xs:element>
         </xs:sequence>
        </xs:completType>
     </xs:element>
  </xs:sequence>

从上面的示例中,我们将在 Car 元素内有另外 20 个元素,其中包含枚举值名称“Type”。我有一个绑定文件将“类型”绑定到 jaxb:typesafeEnumClass 但它不起作用,我仍然将字符串作为我的枚举类型。这是我的绑定示例。

<jaxb:bindings schemaLocation="someLocation">
   <jaxb:bindings node="//xs:element[@name='Car']>
      <jaxb:bindings node="//xs:element[@name='CarModal']">
         <jaxb:bindings node="xs:element[@name='Type']/xs:simpleType>
            <jaxb:typesafeEnumClass name="Type"/>
         </jaxb:bindings>
      </jaxb:bindings>
   </jaxb:bindings>
</jaxb:bindings>

感谢您的帮助,我无法更改 xsd

【问题讨论】:

    标签: java enums xsd jaxb


    【解决方案1】:

    我猜你的绑定不够精确。当您编写//xs:element[@name='CarModal'] 时,您基本上会说“我的架构中的任何CarModal 元素”。接下来,你说你有很多Type 元素,所以xs:element[@name='Type']/xs:simpleType 不够精确。

    尝试更精确的表达方式,例如

    xs:complexType/xs:sequence/xs:element[@name='CarModal']/
    xs:complexType/xs:sequence/xs:element[@name='Type']/xs:simpleType
    

    接下来,您的绑定会对不正确的语法产生总体印象。比如这个:

    <jaxb:bindings node="xs:element[@name='Type']/xs:simpleType>
    

    是无效的 XML(在 xs:simpleType 之后缺少 ")。因此,可能根本不考虑您的绑定 - 否则您应该得到一个错误而不是生成的代码。仔细检查是否完全应用了绑定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多