2016-04-13 76 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