在XSD中验证字母数字字段最大长度的最优方式是什么?
实现XSD混合字母数字字段长度校验的方案
问题排查前提
原生xs:string类型本身支持数字、字母、特殊符号混合输入,不会因为内容包含数字触发类型错误。如果出现该报错,优先排查两个问题:
- 是否为
xs:string类型额外添加了仅允许纯字母的<xs:pattern>正则约束 - 是否误将字段基类设置为
xs:int/xs:integer等数值类型,导致含字母的内容触发类型校验失败
具体实现方案
方案1:仅校验最大长度,允许任意字符(含特殊符号)
如果你的字段允许除了字母数字外还包含特殊符号,仅需要限制最大长度匹配数据库字段限制,直接基于原生xs:string添加maxLength约束即可:
<!-- 自定义通用长度校验类型,可复用 --> <xs:simpleType name="stringMaxLen"> <xs:restriction base="xs:string"> <xs:maxLength value="你需要的长度值" /> </xs:restriction> </xs:simpleType>
方案2:严格限制仅允许字母+数字混合,同时校验最大长度
如果字段不允许输入特殊符号,仅允许大小写字母、0-9数字,添加正则pattern约束即可:
<!-- 最大长度20的严格字母数字类型 --> <xs:simpleType name="alphanumericMax20"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9a-zA-Z]*" /> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType>
针对不同字段长度不同的场景
不需要为每个长度单独定义公共类型,直接在对应元素/属性的定义内联写约束即可:
<!-- 用户名:仅允许字母数字,最大长度32 --> <xs:element name="username"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[0-9a-zA-Z]*" /> <xs:maxLength value="32" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- 收货地址备注:允许任意字符,最大长度200 --> <xs:element name="addressNote"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="200" /> </xs:restriction> </xs:simpleType> </xs:element>
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

