验证 XML 文档无法从原始 XSD 文档中加载使用相对路径引用的架构

问题描述

如果我从 xmlSchemaNewParserCtxt() 开始,解析器很好并找到所有引用的模式,但我想知道如果我使用 xmlSchemaNewMemParserCtxt(),我是否能以某种方式告诉它模式在哪里。

问题是,如果我已经在内存中下载了 XSD,我可以将文档 URL 传递给解析器,以便它找到相关的内容吗?

a)

char *urlPath = "http://docs.oasis-open.org/ubl/os-UBL-2.1/xsd/maindoc/UBL-Invoice-2.1.xsd";
xmlSchemaNewParserCtxt (urlPath);

b)

xmlSchemaNewMemParserCtxt (schemaBuffer,buffSize);

变体 a) 工作正常,变体 b) 产生错误 I/O 警告:无法加载外部实体“../common/UBL-CommonAggregateComponents-2.1.xsd”

架构位于此处:http://docs.oasis-open.org/ubl/os-UBL-2.1/xsd

解决方法

最好的解决方案可能是使用 XML 目录,但您也可以使用 xmlRegisterInputCallbacksxmlSetExternalEntityLoader 控制子资源的加载。