如何在XSD的restriction限制规则中允许匹配换行符
带换行CDATA元素的XSD验证方案
问题根因
XML Schema 正则表达式的官方规范中,.元字符默认不匹配换行符(\n)、回车符(\r)等行终止符,所以你用.*作为规则时,只要CDATA内包含换行就会匹配失败,这是XSD的标准特性,并非Python xmlschema库的bug。
正确验证规则
你需要满足两个验证要求:
- 允许文本中包含任意字符(含换行)
- 文本中至少存在一个非空白字符
对应的XSD正则表达式为[\s\S]*\S[\s\S]*:\s匹配所有空白字符(含换行、制表符、空格等)\S匹配所有非空白字符- 规则逻辑为「任意个任意字符 + 至少1个非空白字符 + 任意个任意字符」,完全覆盖需求场景
小提示:如果不需要「至少一个非空白字符」的限制,仅需保留所有字符和换行,直接把规则改成
[\s\S]*即可。
XSD示例代码
假设需要验证的目标元素为custom_text,完整的XSD定义片段如下:
<xs:element name="custom_text"> <xs:simpleType> <xs:restriction base="xs:string"> <!-- 禁止使用xs:token作为基类,会自动折叠换行和空白 --> <xs:pattern value="[\s\S]*\S[\s\S]*"/> </xs:restriction> </xs:simpleType> </xs:element>
换行保留说明
只要你在解析XML文件时没有主动开启「格式化缩进、剔除空白节点」的配置,XML解析器会完整保留CDATA内部的所有换行符,xmlschema库验证时会读取原始文本内容,不需要额外配置即可保留换行。
内容的提问来源于stack exchange,提问作者Sean Duggan
相关产品推荐
相关产品推荐

