如何用枚举字符串限制xsd:list?当前配置验证失败求助
如何用枚举限制XSD列表类型?
我希望允许像a b、a a b、b a这样的内容通过验证,但a b c不合法。不过目前连a b都无法通过验证,请问该怎么实现?
当前XSD Schema
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="example"> <xsd:complexType> <xsd:all> <xsd:element name="stringList" type="restrictedStringList"/> </xsd:all> </xsd:complexType> </xsd:element> <xsd:simpleType name="restrictedStringList"> <xsd:restriction base="stringListType"> <xsd:enumeration value="a"/> <xsd:enumeration value="b"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="stringListType"> <xsd:list itemType="xsd:string"/> </xsd:simpleType> </xsd:schema>
测试XML实例
<?xml version="1.0" encoding="UTF-8"?> <example xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="example.xsd"> <stringList>a b</stringList> </example>
验证报错信息
值 'a b' 不在枚举列表中。
它必须是以下值之一:
- a
- b
问题原因与解决方法
你当前的写法逻辑错误:直接对整个列表类型做枚举限制时,XSD会把完整的列表字符串(比如a b)当作单个枚举项匹配,而非检查列表内的每个元素是否符合规则。因此只有单个a或单个b能通过验证,多元素组合自然失败。
正确的思路是:先定义枚举类型限制单个元素的取值范围,再基于这个枚举类型创建列表类型。这样列表中的每个元素都会被校验是否属于枚举集合,任意顺序、任意次数的a/b组合都能通过,包含其他值则会触发验证错误。
修改后的XSD如下:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="example"> <xsd:complexType> <xsd:all> <xsd:element name="stringList" type="restrictedStringList"/> </xsd:all> </xsd:complexType> </xsd:element> <!-- 定义单个元素的枚举规则 --> <xsd:simpleType name="restrictedString"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="a"/> <xsd:enumeration value="b"/> </xsd:restriction> </xsd:simpleType> <!-- 基于枚举类型创建列表 --> <xsd:simpleType name="restrictedStringList"> <xsd:list itemType="restrictedString"/> </xsd:simpleType> </xsd:schema>
使用这个Schema验证你的a b实例会直接通过;如果将内容改为a b c,验证器会提示c不在枚举范围内,完全符合你的需求。
内容的提问来源于stack exchange,提问作者MarAl
相关产品推荐
相关产品推荐

