2011-05-19 74 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