使用lxml做XML Schema校验无法捕获ID/IDREF匹配问题咨询
lxml库XSD校验未捕获IDREF引用缺失问题解决方案
问题1:lxml ID/IDREF匹配校验开启方法
lxml底层依赖libxml2实现XSD校验能力,默认关闭ID/IDREF引用完整性校验规则,只需调整代码开启对应校验选项即可实现该能力,调整后代码如下:
from lxml import etree as ET # 解析XML时开启属性默认值加载,确保XSD定义的ID类型属性被正确识别 xml_parser = ET.XMLParser(attribute_defaults=True) tree = ET.parse(filePath, parser=xml_parser) # 构建Schema时开启ID/IDREF校验选项 schema = ET.XMLSchema( ET.parse(somePathtoSchemaXsdFile), validation_options=ET.XML_SCHEMA_VAL_VC_ID_IDREF ) isValid = schema.validate(tree) # 可通过schema.error_log查看详细错误信息
问题2:替代方案及说明
如果上述配置未生效,通常是当前环境的lxml或底层libxml2版本存在兼容性缺陷,导致ID/IDREF校验规则未被正确触发。
推荐使用纯Python实现的免费XSD校验库xmlschema作为替代,该库完整支持XSD 1.0/1.1规范,对ID/IDREF等引用校验规则的兼容性更好,适配所有主流Python版本,使用示例如下:
- 安装依赖
pip install xmlschema
- 校验代码
import xmlschema # 加载XSD规则文件 schema = xmlschema.XMLSchema(somePathtoSchemaXsdFile) # 方式1:直接获取校验结果布尔值 is_valid = schema.is_valid(filePath) # 方式2:捕获异常获取详细错误信息 try: schema.validate(filePath) except xmlschema.XMLSchemaValidationError as e: print(f"校验失败:{e}")
内容的提问来源于stack exchange,提问作者beakerchi
相关产品推荐
相关产品推荐

