2012-11-06 223 views
1

我有一個有趣的XML情況,我試圖爲其編寫XSD。我使用的Web服務以一種不尋常的方式發送響應,因爲它在某種程度上是通用的。XSD元素定義具有相同的名稱,但具有不同的屬性

例如,

Web Service調用1:

<rootElement> 
    <result> 
    <resultset> 
     <row attr="some value" attr2="some value 2" /> 
    </resultset> 
    </result> 
</rootElement> 

Web Service調用2:

<rootElement> 
    <result> 
    <resultset> 
     <row someOtherAttr="some value" someOtherAttr2="some value 2" /> 
    </resultset> 
    </result> 
</rootElement> 

正如你所看到的,區分兩個Web服務響應的唯一的事情是行元素內的屬性。

我已經嘗試了幾種不同的方法,爲結果元素提供了一個抽象元素,該元素適用於某個點,但我無法弄清楚如何讓JAXB選擇在編組時使用哪個結果元素。

... other xs declarations excluded for sanity ... 
<xs:element ref="abstractResult" /> 
... snip ... 

<xs:element name="abstractResult" type="ResultType" abstract="true" /> 

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

<xs:complexType name="SomeResultType"> 
    <xs:complexContent> 
    <xs:extension base="ResultType"> 
... snip ... 

這種方法的問題是JAXB試圖實例抽象與resultType在編組,而不是尋找一個合適的實現。

有什麼辦法可以避免這種情況?

非常感謝!

回答

0

最終將模式分解爲獨立文件,其中存在根元素的不同實現。

然後我將多個模式綁定到他們自己的命名空間,因此編組人員能夠區分相似的元素。

由於xml沒有來自web服務的命名空間,因此我使用JDom來設置命名空間,因爲我知道目標對象類型在運行時會是什麼。

希望這可以幫助任何有興趣的人。

相關問題