从深层嵌套的xsd元素生成枚举

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从深层嵌套的xsd元素生成枚举相关的知识,希望对你有一定的参考价值。

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

 <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

答案

我猜你的绑定也不够精确。当你写//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)。因此可能会出现根本不考虑绑定的情况 - 否则您应该得到错误而不是生成的代码。仔细检查是否完全应用了绑定。

以上是关于从深层嵌套的xsd元素生成枚举的主要内容,如果未能解决你的问题,请参考以下文章

XSD2Code++,从 XML 枚举到没有顺序值的 C# 枚举

如何使用多个 NavHost 片段创建深层链接

使用xjc从多个xsd文件生成Java

使用 XSD 1.1 的动态枚举限制

修改 XML 模式时如何管理 ItemChoiceType 枚举的更改?

遍历具有深层嵌套对象和数组的对象数组