Xml JAXB2将xsd:restrictions映射为子类和(un)marshall xsi:type

Xml JAXB2将xsd:restrictions映射为子类和(un)marshall xsi:type,xml,xsd,jaxb,marshalling,jaxb2,Xml,Xsd,Jaxb,Marshalling,Jaxb2,我已经做了很多研究试图弄明白这一点,但我 仍然不成功 我有许多遵循此模式的XSD: 简单_标识.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:include schemaLocation="./Base_3039.xsd"/> <xsd:include schemaLocation="./Simple_A.xsd"/> <xs

我已经做了很多研究试图弄明白这一点,但我 仍然不成功

我有许多遵循此模式的XSD:

简单_标识.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:include schemaLocation="./Base_3039.xsd"/>
       <xsd:include schemaLocation="./Simple_A.xsd"/>
       <xsd:include schemaLocation="./Simple_S.xsd"/>
       <xsd:include schemaLocation="./Simple_N.xsd"/>
       <xsd:include schemaLocation="./Simple_V1.xsd"/>
       <xsd:include schemaLocation="./Simple_L.xsd"/>
       <xsd:include schemaLocation="./Simple_V.xsd"/>
       <xsd:include schemaLocation="./Simple_C.xsd"/>
       <xsd:simpleType name="Simple_Identification">
               <xsd:restriction base="Base_3039"/>
       </xsd:simpleType>
</xsd:schema>

例如,Simple_.xsd如下所示:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="./Simple_Identification.xsd"/>
    <xsd:simpleType name="Simple_S">
      <xsd:restriction base="Simple_Identification">
           <xsd:minLength value="14"/>
           <xsd:maxLength value="14"/>
     </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>
<Identification xsi:type="Simple_S">XYZUVW</Identification>

最后,我希望能够生成包含 标签如下所示:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="./Simple_Identification.xsd"/>
    <xsd:simpleType name="Simple_S">
      <xsd:restriction base="Simple_Identification">
           <xsd:minLength value="14"/>
           <xsd:maxLength value="14"/>
     </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>
<Identification xsi:type="Simple_S">XYZUVW</Identification>
XYZUVW
现在,如果不启用mapSimpleTypeDef,我可以 marshall/unmarshall XML文件,忽略简单类型,如simple\S

启用MapSimpleType后,将为简单 类型。简单_标识映射到包含基本_3039字段的类。并且Base_3039类包含一个字符串字段。但是,简单_标识的不同子类型的类不扩展简单_标识,而只包含简单_标识类型的字段,这在编组/解编组时没有帮助

例如,在解组此XML文件时:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
  <Identification>EDS-200708021031-950012222329</Identification>
  <Time>2007-08-02T10:31:44.449+01:00</Time>
  <Function>9</Function>
  <Sender>
    <Identity xsi:type="Simple_S">111111380002111</Identity>
 </Sender>
</Header>

EDS-200708021031-9500122222329
2007-08-02T10:31:44.449+01:00
9
111111380002111
Identity的值不可拆分为简单的\u标识对象,而不是专门的简单\u对象。此外,如果我重新整理所有xsi:type属性,它们将丢失在生成的XML中

所以,基本上,我的问题是如何正确地解组并生成包含xsi:type的XML。我正在使用的模式是否不适合这样做?xsd:restriction没有被JAXB解释为一种继承类型吗

请注意,XSD不是我可以修改的,我只需要使用它们来正确读取和生成XML

谢谢你花时间帮我解决这个问题


-Anca

JAXB确实支持
xsi:type
,但在处理复杂类型而不是简单类型时,您只会看到生成的不同子类(以及创建的实例对象)


仅使用方面限制简单类型不会导致使用JAXB创建新类。这是因为,纯粹用面向对象的术语来说,派生类无论如何看起来都与超级类完全相同。

Hi xcut-谢谢你的回答,它让事情变得更清楚了。在这种情况下,我想,我不可能仅基于我拥有的XSD生成类似于上面示例的XML文件。为了能够生成包含xsi:types的内容,我考虑使用JDOM来构造XMLs,然后根据模式进行验证。你有更好的建议吗?