XSD中如何让未设置mixed=true的复杂类型元素允许空白字符内容
针对你使用Python xmlschema库的场景,有两种可行方案,不需要逐个修改元素定义:
方案一:使用xmlschema专属参数(推荐,无需修改XSD)
xmlschema内置了全局校验配置项allow_empty_text,开启后会自动允许所有未设置mixed="true"的复杂类型承载空白文本,完全匹配你的需求,原有XSD不需要做任何改动。
使用示例:
import xmlschema # 加载你的XSD schema文件 schema = xmlschema.XMLSchema("./business.xsd") # 校验XML时传入allow_empty_text参数 schema.validate("./input_data.xml", allow_empty_text=True)
这个配置不会影响你已经标记mixed="true"的元素,这类元素的文本校验规则还是按照原有XSD定义执行,不需要担心破坏需要保留文本校验的逻辑。
方案二:纯XSD标准兼容方案(适用于需要跨校验器使用的场景)
如果你需要XSD本身兼容所有标准XSD校验器,可以定义一个全局抽象基类,所有需要允许空白内容的元素继承该基类即可,比逐个定义空白规则效率高很多:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <!-- 全局抽象基类:仅允许空白文本 --> <xs:complexType name="OnlyWhitespaceAllowedType" abstract="true"> <xs:simpleContent> <xs:restriction base="xs:string"> <xs:whiteSpace value="collapse"/> <xs:length value="0"/> </xs:restriction> </xs:simpleContent> </xs:complexType> <!-- 原有元素继承该基类即可 --> <xs:element name="source"> <xs:complexType> <xs:complexContent> <xs:extension base="OnlyWhitespaceAllowedType"> <xs:attribute name="id" use="required" type="xs:string"/> <xs:attribute name="name" use="required" type="xs:string"/> <xs:attribute name="abbrev" type="xs:string" default=""/> <xs:attribute name="description" type="xs:string" default=""/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <!-- 其余XSD定义保持不变 --> <xs:element name="autotag"> <xs:complexType> <xs:attribute name="group" use="required"/> <xs:attribute name="tag" use="required"/> </xs:complexType> </xs:element> <xs:element name="enmasse"> <xs:complexType mixed="true"> <xs:sequence minOccurs="0"> <xs:element maxOccurs="1" ref="autotag"/> </xs:sequence> <xs:attribute name="stage" use="required"/> </xs:complexType> </xs:element> </xs:schema>
内容的提问来源于stack exchange,提问作者Sean Duggan
相关产品推荐
相关产品推荐

