JAXB2 map xsd:作为子类的限制和(un)marshall xsi:types

时间:2011-05-19 08:18:46

标签: xml xsd jaxb marshalling jaxb2

我一直在做很多研究,试图解决这个问题,但是 仍然不成功。

我有许多遵循此架构的XSD:

Simple_Identification.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_S.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>

最终,我希望能够生成包含的XML文件 标签看起来像这样:

<Identification xsi:type="Simple_S">XYZUVW</Identification>

目前,我没有启用mapSimpleTypeDef,我能够 marshall / unmarshall XML文件,忽略Simple_S等简单类型。

启用mapSimpleTypeDef后,为简单生成类 类型。 Simple_Identification映射到包含Base_3039字段的类。 Base_3039类包含一个String字段。但是,Simple_Identifications的不同子类的类不会扩展Simple_Identification,而只包含Simple_Identification类型的字段,这在编组/解组时没有用。

例如,在解组此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>

Identity的值是Unmahalled到Simple_Identification对象而不是专用的Simple_S对象。此外,如果我编组回所有xsi:type属性在生成的XML中丢失。

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

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

感谢您花时间帮我解决这个问题!

-Anca

1 个答案:

答案 0 :(得分:0)

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

仅使用构面限制简单类型会导致使用JAXB创建新类。这是因为,纯粹在面向对象的术语中,派生类看起来与超类完全相同。