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

时间:2013-02-13 15:08:19

标签: xml xsd

我正在尝试为现有的XML文档创建XSD。我真的无法改变XML,所以我需要让XSD适合它(我知道这有点倒退)。

在XML中,有一个名为Group的元素。此元素具有一个或多个功能。大约有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属性是否接受仅由有效枚举值组成的逗号分隔列表?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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