2013-03-12 114 views
1

我正在使用xsd,試圖讓它驗證xml。XSD具有相同內部結構的兩個元素

xml用於創建對象。有兩種類型的對象可以由列表中的元素創建:SC和SMSC。 SMSC是一個SC,並對其進行擴展。

SMSC不包含任何新屬性。從xml的角度來看,除了定義其屬性的元素被<SMSC>標籤包裝而不是<SC>標籤外,SMSC在各方面都與SC完全相同。

我們的XSD看起來是這樣的:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name='Definitions'> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element maxOccurs="unbounded" name="SC"> 
      <!--SNIP properties of SC and SMSC --> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

有沒有辦法來改變這種允許SC或SMSC作爲元素,不是複製所有的屬性定義的一個元素SMSC其他?我們不希望將文檔的長度加倍並複製所有的屬性定義。

就目前來看,我們在XML中唯一的驗證錯誤就是我們有一個SMSC元素。如果沒有辦法解決這個問題而不重複所有的屬性定義,我們會保持原樣,但是如果可行的話,我們顯然寧願消除拋出的警告。

回答

1

雖然它令人困惑by tags instead of tags,我會認爲下面要麼回答你的問題,要麼引出更好的解釋。

所以,你看到的是避免重複;您實際上不需要附加類型SMSC(請參閱定義2),但我已將它放在案例中(定義)。使SMSC元素的SC類型將工作完全相同。

定義/Definitions2Definitions3是一個使用的取代基,而不是選擇之間的差。我個人更喜歡替代團體進行選擇,但遇到與替代團體有關的問題並不罕見(即他們在這裏和那裏都得不到很好的支持)。

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="SC"> 
     <xsd:sequence> 
      <!-- Stuff goes here --> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="SMSC"> 
     <xsd:complexContent> 
      <xsd:extension base="SC"/> 
     </xsd:complexContent> 
    </xsd:complexType> 
    <xsd:element name="Definitions"> 
     <xsd:complexType> 
      <xsd:choice maxOccurs="unbounded"> 
       <xsd:element name="SC" type="SC"/> 
       <xsd:element name="SMSC" type="SMSC"/> 
      </xsd:choice> 
     </xsd:complexType> 
    </xsd:element> 
    <!-- Another way --> 
    <xsd:element name="Definitions2"> 
     <xsd:complexType> 
      <xsd:choice maxOccurs="unbounded"> 
       <xsd:element name="SC" type="SC"/> 
       <xsd:element name="SMSC" type="SC"/> 
      </xsd:choice> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="Definitions3"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element ref="SC" maxOccurs="unbounded"/>    
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="SC" type="SC" />     
    <xsd:element name="SMSC" type="SMSC" substitutionGroup="SC" />    
</xsd:schema> 
+0

This Works,thanks!我沒有意識到你可以定義新的複雜類型,並在定義中使用它們。你每天學習新的東西! (順便說一下,第一個版本現在爲我們工作) – Jeff 2013-03-12 15:31:41

相關問題