2016-06-29 22 views
-3

我有一個complextype-'A',它使用擴展名「base」,後跟一系列元素。現在,擴展基礎 - 「基礎」本身就是複雜類型,並且在序列ex中具有多個元素引用(元素1,2,3)。我遇到的問題是,當試圖驗證XML時,我得到的錯誤是元素'A'具有無效子元素'1',並且它列出了XML上的其他可能元素。因爲我在一個組中工作,所以我只能更改架構而不是XML。 Sry基因,如果我解釋很奇怪例如將低於使用複雜類型進行疑難解答

這是架構

<xsd:complexType name="A"> 
     <xsd:complexContent> 
      <xsd:extension base="Base" > 
       <xsd:sequence minOccurs="0" maxOccurs="unbounded"> 
        <xsd:element name="B" minOccurs="0"> 
         <xsd:complexType> 
          <xsd:complexContent> 
           <xsd:extension base="BData"/> 
          </xsd:complexContent> 
         </xsd:complexType> 
        </xsd:element> 
        <xsd:element name="C" minOccurs="0"> 
         <xsd:complexType> 
          <xsd:complexContent> 
           <xsd:extension base="CData"/> 
          </xsd:complexContent> 
         </xsd:complexType> 
        </xsd:element> 
        <xsd:element name="D" minOccurs="0"> 
         <xsd:complexType> 
          <xsd:complexContent> 
           <xsd:extension base="DData"/> 
          </xsd:complexContent> 
         </xsd:complexType> 
        </xsd:element> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 

的XML

<A> 
    <D/> 
    <B/> 
    <C/> 
    <T>  <---- This is the element from the base'Base' that gives me the error> 
    <......> 
    </T> 
</A> 

行,所以在看到評論後,我打算細說多一點我的問題。這是我第一次發佈一個問題,我面臨的問題與我的工作有關,所以我不能發佈具體的細節。所以主要的問題是'A'。所以我有我正在編輯的架構,假設驗證多個XML。因此,我的目標是找到一種方法讓複雜類型A使每個元素都有效,但同時如果元素被稱爲擴展,無論錯誤的次數或次數不會彈出。我已經研究過「全部」元素,但問題在於它只能發生一次。結論:序列無限次數發生,但是次序受限,所有沒有次序限制但限於1次發生。這就像歡迎任何解決方案的兔子洞。

+1

XML元素名稱不能以數字開頭。 – kjhughes

+0

您錯過了一個關閉'xsd:sequence'元素。 – kjhughes

+0

你沒有包含引用的'Base'聲明。 – kjhughes

回答

0

在XSD 1.0中,所有複雜類型的擴展都會創建一個序列,其第一個成員是基類型中定義的複雜類型,其第二個成員是擴展中給出的內容模型。那麼,基本類型的消費者的保證是,如果他們閱讀元素的開始,他們會在那裏找到他們需要的東西,當他們開始看到他們沒有準備好的孩子時,他們可以停止閱讀。 (或者更正式地說:在擴展類型E的任何有效實例I中,I的子序列的前綴對E的基類型有效。)

在XSD 1.1中,它也是可能將所有小組與另一個小組進行擴展,並使結果(儘可能多的人表示他們想要)成爲一個更大的所有小組;但是,序列和選擇與XSD 1.0中的相同。

所以你的實例的問題是它有一個元素允許的基本類型,而不是之前,擴展名允許的元素。如果你希望它在你的類型A中是合法的,那麼A和Base之間的關係不是擴展類型之一,你必須以其他方式定義它。