Python怎么用lxml的RelaxNG验证XML

用lxml的RelaxNG验证XML需先加载合法.rng文件或字符串生成验证器,再解析XML为etree对象后调用validate();常见问题包括路径错误、编码不匹配、命名空间未声明及忽略error_log。

lxmlRelaxNG 验证 XML,核心是:先加载 RelaxNG 模式(.rng 文件或字符串),再用它校验 XML 文档对象(etree.ElementTreeetree.Element)。过程不复杂,但几个细节容易出错。

准备 RelaxNG 模式文件

确保你有一个合法的 .rng 文件(XML 格式),例如 schema.rng



  
    
      
        
        
      
    
  

注意:RNG 必须是 well-formed XML,命名空间要正确;如果用在线或程序生成的 RNG,确认没有遗漏 xmlns 声明。

加载 RNG 并创建验证器

etree.RelaxNG 加载模式,返回一个可调用的验证器对象:

  • 从文件加载:rng = etree.RelaxNG(file="schema.rng")
  • 从字符串加载:rng = etree.RelaxNG(etree.fromstring(rng_content))
  • 加载失败会抛 etree.RelaxNGParseError,建议加 try/catch

验证 XML 文档

验证前需把 XML 解析为 etree 对象(不能直接传文件路径或字符串):

  • 解析 XML:doc = etree.parse("book.xml")doc = etree.fromstring(xml_bytes)
  • 执行验证:is_valid = rng.validate(doc)
  • 检查结果:if not is_valid: print(rng.error_log) —— 错误详情在 error_log 属性里

常见问题处理

验证失败却不报错?可能原因:

  • RNG 文件路径错误,或编码不匹配(建议用 open(..., encoding="utf-8") 读取后传入 fromstring
  • XML 中有未声明的命名空间,而 RNG 没做适配(RNG 默认不处理 NS,如需支持,得在 RNG 中显式声明 ns 并用 nameattribute 匹配)
  • validate() 只返回布尔值,必须主动查 error_log 才能看到具体哪行哪列出错

基本上就这些。只要 RNG 合法、XML 可解析、验证调用顺序对,就能跑通。