2016-04-13 114 views
1

對不起,這麼長的問題。我會盡力讓它變得簡單。 我們正在研究模塊化計算框架。該框架從xml文件讀取配置,我們想驗證xsd的配置。在添加新模塊時,我們希望xsd在可維護性方面儘可能簡單。 框架的結構是下面的(在C#):Xsd和多繼承

interface IModule { ... } 
interface ISource : IModule { ... } 
interface IFilter : IModule { ... } 
interface IProcessor : IModule { ... } 

,我們有抽象實現的各種模塊接口和模塊(例如ObjLoader:AbstractSource)的執行。 XML的結構如下:

<Test> 
    <Sources> 
     <ObjLoader .../> 
    </Sources> 
    <Filters> 
     ... 
    </Filters> 
    <Processors> 
    ... 
</Test> 

目前,以避免有必要大量修改XSD每一個新的模塊,我們有以下test.xsd:

<xs:include schemaLocation="framework.xsd"/> 
<xs:include ... modules /> 
<!-- adding includes for every module or group 
of modules is the only modification --> 

<xs:element name="Test"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="this:Sources" 
        minOccurs="1" 
        maxOccurs="1"/> 
     ... 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

,共同framework.xsd:

<xs:element name="Sources"> 
    <xs:complexType> 
    <xs:choice maxOccurs="unbounded"> 
     <xs:element ref="this:AbstractSource"/> 
    </xs:choice> 
    </xs:complexType> 
</xs:element> 

<xs:element name="AbstractSource" 
      abstract="true"/> 

<xs:complexType name="ISource"> 
    <xs:complexContent> 
    <xs:extension base="this:IModule"> 
     ... 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 
... 

每個模塊(或模塊的組)具有其自己的XSD文件與其定義,並且該文件包括在test.xsd:

<xs:include schemaLocation="framework.xsd"/> 

<xs:element name="ObjLoader" 
    substitutionGroup="this:AbstractSource"> 
    <xs:complexType> 
    <xs:complexContent> 
     <xs:extension base="this:ISource"> 
     ... 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:element> 

到目前爲止這麼好,一切運作良好。對於每個包含模塊的dll,我們提供相應的xsd並將其包含在test.xsd中。但是在開發過程中,出現了主要是某種類型的模塊,但可能產生另一種操作作爲副作用。這是不是在C#中端的問題,因爲我們可以有下面的類:

class GreatProcessingFilter : AbstractProcessor, 
           IFilter { ... } 

是否有修改我們的XSD到能夠處理這樣的元素,可以是多個抽象元素的替代方式?喜歡的東西:

<xs:element name="GreatProcessingFilter" 
      substitutionGroup="AbstractProcessor" 
      substitutionGroup="AbstractFilter"> ... 

回答

0

XSD 1.1確實允許在substitutionGroup屬性的QName多。然而,它並不會導致聲明爲多個替換組成員的元素被賦予一個從分配給各個替換組頭的類型動態構造的類型。所以它可能不符合您尋找的意義上的多重繼承。您可能會發現感興趣的XML schemas with multiple inheritance

[此外,響應OP的評論]在XSD 1.1中,頂層元素可以聲明爲多個替換組;它可以替換任何已命名的元素(除非被替換組頭上的相關final屬性阻止)。對替代組聯盟的限制與1.0一樣:被聲明的元素的類型必須對每個替代組頭的類型有效可替代。如果沒有給出該元素的類型,則默認具有與第一個替換組頭相同的類型。

+0

謝謝你的回答。您能否告訴我更多關於替代組中多個QName的可能性? – Petr

+0

請參閱附加答案。 –

+0

謝謝,另外...我可能會嘗試找出其他方法 – Petr