使用逗号的XSD架构分隔的枚举列表

问题描述:

我试图为现有的XML文档创建一个XSD。我真的不能改变XML,所以我需要让XSD适合它(我知道这有点倒退)。使用逗号的XSD架构分隔的枚举列表

在XML中,有一个称为组的元素。这个元素有一个或多个特征。大约有40个有效的功能名称。所以我选择将它们建模为Enum。枚举看起来是这样的:

<xs:simpleType name="FeatureNamesEnumType"> 
    <xs:restriction base="xs:normalizedString"> 
     <xs:enumeration value="Feature1"/> 
     <xs:enumeration value="Feature2"/> 
     <xs:enumeration value="Feature3"/> 
    </xs:restriction> 
</xs:simpleType> 

然后,该组我有以下几点:

<xs:complexType name="groupType"> 
    <xs:attribute type="FeatureNamesEnumType" name="features" use="required"/> 
    </xs:complexType> 

我一直运行到的是,在XML文件中,属性可以设置为一个问题用逗号分隔的功能列表。例如:

<group name="Group1" 
     features="Feature1,Feature2" 
</group> 

这不会针对XSD进行验证,因为此逗号分隔列表在枚举中为no。

我知道最好让一个组包含一系列功能,但这不是一个选项,因为我无法更改XML文件。

我的目标是如果功能与枚举值不匹配,则导致验证失败。因此,例如,我想要以下内容无效:

<group name="Group1" 
      features="Feature1,Featur2" 
</group> 

拼写错误应导致此操作无效。在我的XSD中有没有一种方法可以指示Group上的features属性接受由仅有效枚举值组成的逗号分隔列表?

就其本身而言,XSD 1.0不能用于定义您需要的约束。如果您可以预处理或后处理这些字段以用逗号替换逗号,则可以定义FeatureNamesEnumType的xsd:列表。

正确的方法取决于您的平台。例如,如果在.NET上,我会将这些字段定义为字符串,可能会被xsd:pattern约束;那么我会手动验证每个字段的值是否与上面定义的xsd:list类型的简单类型一致 - 这是在.NET中执行的一个非常简单的事情。如何有效地到达这些字段取决于您的处理模型...

+0

xs:list几乎是我所需要的。我能够说服XML文件作者更改为分隔空间而不是逗号分隔。然后,xs:list工作得很好。 – Jon 2013-02-14 14:53:02

使用正则表达式与xs:pattern可以完全验证XSD中features属性的值。取决于您的需求,如<xs:simpleType><xs:restriction base="xs:token"><xs:pattern value="(Feature1|Feature2|Feature3)(,(Feature1|Feature2|Feature3))*"/></xs:restriction></xs:simpleType>