如何配置XSD实现XML校验仅允许使用Schema中指定的合法标签
XSD严格校验禁止未定义标签实现方案
实现逻辑
你需要的严格校验能力是XSD的原生支持能力,无需使用enumeration(该语法确实仅用于限制节点值范围),核心配置思路如下:
- 所有复合类型节点使用
xs:sequence显式枚举允许的子元素,不要添加xs:any通配符配置 - 所有元素明确指定
minOccurs和maxOccurs限制出现次数,默认值为1/1,不要设置为unbounded除非业务需要允许多次出现 - 执行校验时开启严格模式,禁用宽松的通配规则
适配你的业务场景的XSD示例
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 根节点root定义 --> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="a" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="b" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="c" type="cType" minOccurs="1" maxOccurs="1"/> <!-- 未配置xs:any,因此root下不允许出现a/b/c之外的任何标签 --> </xs:sequence> </xs:complexType> </xs:element> <!-- c节点的子元素规则定义 --> <xs:complexType name="cType"> <xs:sequence> <xs:element name="c1" type="xs:string" minOccurs="1" maxOccurs="1"/> <!-- 未配置xs:any,因此c下不允许出现c1之外的任何标签 --> </xs:sequence> </xs:complexType> </xs:schema>
校验效果
上述XSD会直接拦截你提到的两类非法XML:
c1节点直接放在root下:c1未被声明为root的允许子元素,校验直接报错- 出现未定义的
BAD_TAG:Schema中无该标签声明,且无通配符允许未知元素,校验直接报错
补充说明
如果你的业务使用命名空间,只需将所有元素绑定到对应命名空间,校验时开启命名空间校验即可进一步避免同名节点的混淆问题。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

