2010-06-01 54 views
4

以W3C的車輛XSD作爲一個例子:XML和XSD - 使用元素名稱作爲替換的xsi的:類型多態性

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://cars.example.com/schema" 
      xmlns:target="http://cars.example.com/schema"> 

    <complexType name="Vehicle" abstract="true"/> 

    <complexType name="Car"> 
    <complexContent> 
     <extension base="target:Vehicle"/> 
     ... 
    </complexContent> 
    </complexType> 

    <complexType name="Plane"> 
    <complexContent> 
     <extension base="target:Vehicle"/> 
     <sequence> 
     <element name="wingspan" type="integer"/> 
     </sequence> 
    </complexContent> 
    </complexType>  
</schema> 

,和 'meansOfTravel' 的以下定義:

<complexType name="MeansOfTravel"> 
    <complexContent> 
    <sequence>   
     <element name="transport" type="target:Vehicle"/>   
    </sequence> 
    </complexContent> 
</complexType> 

<element name="meansOfTravel" type="target:MeansOfTravel"/> 

根據這個定義,你需要使用XSI指定您的實例的類型:類型,像這樣:

<meansOfTravel> 
    <transport xsi:type="Plane"> 
    <wingspan>3</wingspan> 
    </transport> 
</meansOfTravel> 

我只想李柯以acheive一個「類型的名字」 - 映射「元素的名稱」,使這可能是與剛剛

<meansOfTravel> 
    <plane> 
    <wingspan>3</wingspan> 
    </plane> 
</meansOfTravel> 

唯一的辦法來代替我能做到這一點到現在爲止是擺明:

<complexType name="MeansOfTravel"> 
    <sequence>   
    <choice> 
     <element name="plane" type="target:Plane"/> 
     <element name="car" type="target:Car"/>   
    </choice> 
    </sequence> 
</complexType> 

<element name="meansOfTravel" type="target:MeansOfTravel"/> 

但這意味着我必須在'MeansOfTravel'複雜類型中列出所有可能的子類型。如果你調用元素'plane',是否沒有辦法讓XML解析器假定你的意思是'Plane'?或者我必須明確選擇?我只想讓我的設計保持乾爽 - 如果您有任何其他建議(比如團體等) - 我全都是耳朵。

回答

3

這裏有一個共同的設計模式,你可以使用子類型(就像你已經做的那樣)以及替換組中的元素。替代組中的元素必須是它們被替換的元素的子類型。

不幸的是,替代組元素需要定義爲全局元素。所以,你會擁有這樣的:

<complexType name="MeansOfTravel"> 
    <complexContent> 
    <sequence>   
     <element ref="transport"/> 
    </sequence> 
    </complexContent> 
</complexType> 

<element name="transport" type="target:Vehicle"/> 
<element name="plane" type="target:Plane" substitutionGroup="target:transport"/> 

然後,在XML文檔中,你可以使用:在置換組here

<meansOfTravel> 
    <plane>...</plane> 
</meansOfTravel> 

更多信息。不過,不幸的是,解析器無法猜測這個,所以你仍然必須列出元素:(儘管如此,選擇有一個優點:模式可以通過導入而擴展到外部,而不用修改它。選擇無法擴展。

+1

謝謝你,這看起來很整潔。除了擴展參數外,還有其他的好處嗎?我在問,因爲看起來很忙,我想知道如果選擇是更合理的選擇沒有雙關語意思)考慮可讀性 – 2010-06-01 16:10:56

+2

如果整個模式都在你的控制之下,我會選擇其中的一種方式,它使得使用數據綁定生成的類容易閱讀,並避免引入所有這些全局元素。 – xcut 2010-06-01 17:06:10

+0

好的。選擇它,再次感謝。 – 2010-06-01 18:27:33

相關問題