根据lxml的官方文档,如果要针对xml模式文档验证xml文档,则必须
>构造XMLSchema对象(基本上,解析模式文档)
>构造XMLParser,将XMLSchema对象作为其模式参数传递
>使用构造的解析器解析实际的xml文档(实例文档)
可能会有变化,但是无论您如何操作,其本质都差不多,-模式是“外部”指定的(与在实际的xml文档中指定相反).
如果您遵循此过程,那么肯定会进行验证,但是如果我正确理解它,则它将完全忽略xsi中的schemaLocation和noNamespaceSchemaLocation属性的整个概念
从事实开始,这引入了一大堆限制,即您必须自己处理实例与架构的关系(要么将其存储在外部,要么编写一些技巧以从实例的根元素中检索架构位置文档),则无法使用多个架构(例如,当每个架构管理自己的名称空间时)等方式来验证文档.
所以问题是:也许我错过了一些琐碎的事情或做错了?还是我对lxml有关架构验证的限制的陈述是正确的?
回顾一下,我希望能够:
>让解析器在解析/验证时使用实例文档中的架构位置声明
>使用多个模式来验证xml文档
>在非根元素上声明架构位置(不是非常重要)
也许我应该寻找其他图书馆?虽然,这真是令人遗憾,但-lxml是python的事实上的xml处理库,就性能/功能/便利性而言,每个人都将其视为最好的xml库(在某种程度上是正确的)
解决方法:
注意:这并不是完整的答案,因为我对lxml的了解不多.
在可以告诉你:
>忽略文档中的架构位置,而是管理名称空间->应用程序中的模式文件映射几乎总会更好,除非可以保证与文件相比模式将位于非常特定的位置.如果要将其移出代码,请使用目录或提供配置文件.
>如果确实要使用schemaLocation,并且要验证多个模式,则只需将它们全部包含在名称空间URI /位置对中的一个schemaLocation属性中,以空格分隔即可:xsi:schemaLocation =“ urn:schema1 schema1.xsd urn:schema2 schema2.xsd.
>最后,我认为任何处理器都不会找到在非根元素上声明的schemaLocation属性.没关系:将它们全部放在根上.