2015-05-18 44 views
0

我正在使用來自供應商系統的XML,我無法更改,我正在嘗試使用JAXB。 XML用於類似API的REST中。請參閱下面的幾個消息示例。每個請求/消息具有相同的根元素名稱,該名稱稱爲MsgRequest,並且它包含每個請求中的幾個公共元素,但它也包含依賴於消息類型的元素。具有繼承但不使用子元素名稱的JAXB

<!-- request 1 --> 
<MsgRequest> 
    <SubType>GetUser</SubType> 
    <RequestID>1</RequestID> 
    <UserName>joe</UserName> 
</MsgRequest> 

<!-- request 2 --> 
<MsgRequest> 
    <SubType>GetCompany</SubType> 
    <RequestID>2</RequestID> 
    <CompanyName>joe</CompanyName> 
</MsgRequest> 

從Java的角度來看,我可以像使用繼承一樣對它進行建模。

class BaseMessage { 
    String subType; 
    Integer requestID; 
}; 

class GetUserMessage { 
    String userName; 
}; 

class GetCompanyMessage { 
    String companyName; 
}; 

我不明白我將如何使用JAXB來表示這個XML。我已經做了一些研究並找到了XMLElementRef,但是會編組引用的元素的名稱,這不是我想要的。

希望我錯過了一些明顯的東西。任何建議感激。

回答

0

XML的設計不適合任何特定的語言或範式。這意味着你可以設計一個可以由Java類層次結構表示的XML,但不能保證某些以你的方式出現的XML結構可以映射到類層次結構中。請考慮XML解析器必須能夠從元素的標記名稱中確定XML元素的(複雜)類型。因此,如果您有兩個標記爲<MsgRequest>的元素,則必須將它們映射到單個Java類型。

您可以爲單個複雜類型編寫一個XML模式,其中包含必填字段subType和requestID,以及可選(minOccurs = 0)字段userName和companyName。它不會是很好的面向對象的風格,但它會生成你的XML。

相關問題