文档内架构声明和lxml

时间:2010-06-05 09:35:52

标签: python xml xsd lxml

根据lxml的官方文档,如果想要针对xml架构文档验证xml文档,则必须

  1. 构造XMLSchema对象(基本上,解析模式文档)
  2. 构造XMLParser,将XMLSchema对象作为其schema参数传递
  3. 使用构造的解析器
  4. 解析实际的xml文档(实例文档)

    可能有变化,但无论你怎么做,本质都是一样的 - 架构是“外部”指定的(而不是在实际的xml文档中指定它)。

    如果您遵循此过程,确实会发生验证,但如果我理解正确,则完全忽略了xsi

    中schemaLocation和noNamespaceSchemaLocation属性的整个概念。

    这引入了一大堆限制,从事实开始,您必须自己处理实例< - >模式关系(将其存储在外部或编写一些hack以从根元素检索模式位置)在实例文档中,您无法使用多个模式验证文档(例如,当每个模式管理自己的名称空间时)等等。

    所以问题是:也许我错过了一些完全无足轻重的事情或做错了?或者我关于lxml关于模式验证的限制的陈述是真的吗?

    总结一下,我希望能够:

    • 让解析器在分析/验证时使用实例文档中的模式位置声明
    • 使用多个架构来验证xml文档
    • 在非根元素上声明架构位置(不是非常重要)

    也许我应该寻找一个不同的图书馆?虽然,这真是一种耻辱,但lxml是python的事实上的xml处理库,并且在性能/功能/便利性方面被大家认为是最好的(并且在某种程度上是正确的)< / p>

1 个答案:

答案 0 :(得分:3)

警告:这不是完整的答案,因为我对lxml的了解并不多。

可以告诉你:

  • 忽略文档中的schemalocations,而不是管理命名空间 - &gt;应用程序中的模式文件映射几乎总是更好,除非您可以保证模式与文件相比位于非常特定的位置。如果要将其移出代码,请使用目录或提供配置文件。
  • 如果执行想要使用schemaLocation,并且想要验证多个模式,只需将它们全部包含在名称空间URI /位置对中的一个schemaLocation属性(用空格分隔)中:xsi:schemaLocation="urn:schema1 schema1.xsd urn:schema2 schema2.xsd
  • 最后,我认为任何处理器都不会发现在非根元素上声明的schemaLocation属性。并不重要:只需将它们全部放在根部。