2011-05-19 68 views
0

我一直在进行大量的研究,试图弄清楚这一点,但是 仍然不成功。JAXB2 map xsd:限制作为子类和(un)marshall xsi:类型

我有一些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,我能够 马歇尔/和解组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> 

认同的价值是unmashalled到Simple_Identification对象不是一个专门的Simple_S对象。而且,如果我收回所有xsi:type属性,则会在生成的XML中丢失。

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

请注意,XSD不是我的修改,我只需要与他们合作来正确地读取和生成XML。

感谢您花时间帮我弄清楚这一点!

-Anca

回答

0

JAXB不支持xsi:type,但你只会看到生成不同的子类(和对象实例的创建)与复杂的类型,而不是简单类型的时候。

仅使用方面限制简单类型不是导致使用JAXB创建新类。这是因为,纯粹以面向对象的术语来说,派生类看起来与超类完全一样。

+0

嗨xcut-感谢您的回答,它使事情变得更加清晰。在这种情况下,我猜想,仅仅基于我拥有的XSD,我无法生成类似上述示例的XML文件。 为了能够生成包含xsi:types的东西,我正在考虑使用JDOM来构造XML,然后根据模式进行验证。 你有更好的建议吗? – Anca 2011-05-19 14:54:56