對不起,這麼長的問題。我會盡力讓它變得簡單。 我們正在研究模塊化計算框架。該框架從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"> ...
謝謝你的回答。您能否告訴我更多關於替代組中多個QName的可能性? – Petr
請參閱附加答案。 –
謝謝,另外...我可能會嘗試找出其他方法 – Petr