2011-12-21 62 views
2

我是JaxB World的新角色,我面臨着一個問題w.r.t.將存儲的xml內容解組到Java類對象中。問題描述如下。讓我知道這是可以解決的 我有一個包含以下內容我的XSD文件(這只是一個例子) 學生信息 基於具體實例的反編組

<xs:complexType name="specialization" abstract="true"> 
    </xs:complexType> 


    <xs:complexType name="Engineering"> 
     <xs:complexContent> 
      <xs:extension base="specialization"> 
       <xs:sequence> 
        <xs:element name="percentage" type="xs:int" minOccurs="0"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="Medical"> 
     <xs:complexContent> 
      <xs:extension base="specialization"> 
       <xs:sequence> 
        <xs:element name="grade" type="xs:string" minOccurs="0"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
</xs:complexType> 

現在所有相應的Java類是通過編譯xsd生成的。現在我們假設在我的應用程序中,我將通過構建工程類實例來設置學生信息的特化屬性。因此,所有的操作後,當我保存 是得到保存會有像下面

<Student> 
    <Name>Name1</Name> 
    <Specialization> 
     <percentage>78<percentage> 
    </Specialization> 
</Student> 

現在,當上述內容無二解組條目的XML文件,解組失敗說意想不到的元素。我想這是b'co​​s專業化元素是專門類型的,它調用本身的unmarshalling而不是存儲的派生對象。

我希望我的解釋清楚。有沒有什麼方法可以基於派生類實例類型進行解組? xsd和bindings.xjb文件完全在我的控制之中,所以我可以添加或修改任何表達式以傳遞解組規則來解開派生類。


感謝您的建議,但它仍然不適合我。

這裏是我試過

選項#1 - XSI:類型
我的XSD看起來一樣的東西在例子解釋,但仍然是XSI的:式中不產生XML來。編譯時是否需要添加其他設置?我應該使用哪個JaxB版本?

選項#2 - 替換組
當我在我的xsd中添加替換條目部分時,XSD編譯失敗,說重複的名稱爲「Engineering」和「Medical」。我猜元素名稱和類型名稱是相同的彙編嬰兒牀(所有工程,醫療,專業化在類型定義和元素名稱都相同)

我無法修改生成的類,因爲我們正在使用模型驅動架構。唯一掌握的就是xsd。任何對xsd的修改都是允許的。理想情況下,第一選擇應該已經工作但無法弄清楚它爲什麼不起作用。如果您有一些建議來縮小問題,請告訴我。

回答

1

有使用JAXB當表示在XML Java繼承的不同方式:

選項#1 - 的xsi:type

在該表示中的一個屬性被用於指示子類型被用來填充這個元素。

<Student> 
    <Name>Name1</Name> 
    <Specialization xsi:type="Engineering"> 
     <percentage>78<percentage> 
    </Specialization> 
</Student> 

有關詳細示例見:

選項#2 - 換人組

這裏使用的元件名稱來表示子類型。這相當於替換組的模式概念,並利用JAXB的@XmlElementRef註釋:

<Student> 
    <Name>Name1</Name> 
    <Engineering> 
     <percentage>78<percentage> 
    </Engineering> 
</Student> 

有關詳細示例,請參閱:

+0

感謝您的建議,但它仍然沒有工作爲了我。 這是我試過的 選項#1 - xsi:type 我的xsd看起來與示例中所解釋的相同,但Xsi:類型不在xml中。編譯時是否需要添加其他設置?我應該使用哪個JaxB版本? – user1110282 2011-12-23 14:15:25

+0

選項#2 - 替換組 當我在我的xsd中添加替換條目部分時,XSD編譯失敗,說重複名稱爲「Engineering」和「Medical」。我猜元素名稱和類型名稱是相同的彙編子句(所有工程,醫學,專業化在類型定義和元素名稱都相同) 我不能修改生成的類,因爲我們正在使用模型驅動的體系結構。唯一掌握的就是xsd。任何對xsd的修改都是允許的。理想情況下,第一選擇應該已經工作但無法弄清楚它爲什麼不起作用。讓我知道你是否有一些建議 – user1110282 2011-12-23 14:16:10