对不起,这么长的问题。我会尽力让它变得简单。 我们正在研究模块化计算框架。该框架从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