2013-09-16 117 views
0

我相信已經理解了this article中的所有內容,但似乎仍然有一些工作適合我。XML架構中的簡單繼承樹

如果我在類的簡單繼承樹:

A (abstract) 
^ 
B 
^ 
C 

而且我想在我的XML對象的簡單列表,followes:

<mylist> 
    <B>lalala</B> 
    <C>fofofo</C> 
    <C>fofofo</C> 
    <C>fofofo</C> 
    <C>fofofo</C> 
    <B>lalala</B> 
</mylist> 

似乎不當我嘗試驗證此方案對:

<xs:schema> 
    <xs:complexType name="A" abstract="true"> 
     <xs:element name="text" type="xs:string"/> 
    </xs:complexType> 
    <xs:complexType name="B"> 
     <xs:complexContent> 
      <xs:extension base="A"/> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="C"> 
     <xs:complexContent> 
      <xs:extension base="B"/> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="mylist> 
     <xs:sequence maxOccurs="unbounded"> 
      <xs:element name="A" type="A"/> 
     </xs:sequence> 
    </xs:element> 
</xs:schema> 

請記住,這只是僞代碼沒有很多命名空間的短xml的緣故。

爲什麼一個驗證器告訴我(記事本+ +爲例),它仍然在期待一個<A>而不是<B><C>

回答

1

你越來越近了。但是你將元素名稱與類型名稱相混淆。類型B和C可以替代類型A,但是您尚未聲明任何名爲B和C的元素,更不用說聲明它們並且使它們可以替換元素A.

以下XML實例對修正有效您的方案版本:

<mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="Mamix.xsd"> 
    <A xsi:type="B"><text>lalala</text></A> 
    <A xsi:type="C"><text>fofofo</text></A> 
    <A xsi:type="C"><text>fofofo</text></A> 
    <A xsi:type="C"><text>fofofo</text></A> 
    <A xsi:type="C"><text>fofofo</text></A> 
    <A xsi:type="B"><text>lalala</text></A> 
</mylist> 

如果你想允許元素B和C來代替,用適當的類型聲明他們並指定他們是替代的元素A(必須是一個頂級元素爲這是可能)。你的架構將是這樣的:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="A" abstract="true"> 
     <xs:sequence> 
      <xs:element name="text" type="xs:string"/> 
     </xs:sequence>   
    </xs:complexType> 

    <xs:complexType name="B"> 
     <xs:complexContent> 
      <xs:extension base="A"/> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="C"> 
     <xs:complexContent> 
      <xs:extension base="B"/> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="A" type="A"/> 
    <xs:element name="B" type="B" substitutionGroup="A"/> 
    <xs:element name="C" type="C" substitutionGroup="A"/> 

    <xs:element name="mylist"> 
     <xs:complexType> 
      <xs:sequence maxOccurs="unbounded"> 
       <xs:element ref="A"/> 
      </xs:sequence>    
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

根據該模式,下面的實例(通過添加「文本」元素的聲明「A」,需要從原始的XML修改)是有效的:

<mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="Mamix.xsd"> 
    <B><text>lalala</text></B> 
    <C><text>fofofo</text></C> 
    <C><text>fofofo</text></C> 
    <C><text>fofofo</text></C> 
    <C><text>fofofo</text></C> 
    <B><text>lalala</text></B> 
</mylist>