我们最近在生产基础架构上采用了https-everywhere策略,这导致了XML架构验证的一些问题,我想知道是否有人可以帮我澄清。
我们在服务器上的静态路径上提供了架构文档,它们曾在http://path.to/schema.xsd处可用。它们不再可用,而是位于https://path.to/schema.xsd,但对原始网址的任何调用都会产生301(永久移动)。
架构文档本身具有相互引用,特别是包含以下行的父架构:
<xs:import namespace="http://example.com/schemas/iso_639-2b/1.0"
schemaLocation="http://example.com/static/iso_639-2b.xsd">
(请注意,schemaLocation仍然指向URL的http版本,因为我们没有预料到必须更改此内容,具有重定向的内容)
尝试根据架构验证传入的XML文档
schema_path = "/path/to/file/on/disk/schema.xsd"
schema_file = open(schema_path)
schema_doc = etree.parse(schema_file)
schema = etree.XMLSchema(schema_doc)
根schema.xsd加载(因为它来自本地磁盘),但是在最后一行,当我们初始化XMLSchema(使用lxml作为底层的etree实现)时,我们得到一个例外:
{XMLSchemaParseError}element decl. 'language', attribute 'type': The QName value '{http://example.com/schemas/iso_639-2b/1.0}LanguageCodeType' does not resolve to a(n) type definition., line 41
我的工作理论是lxml(甚至是xml架构规范,虽然我无法找到任何文档)要么不遵循重定向要么不支持https(或两者都支持!)。
任何有关适当修复的信息和建议都会非常感激。