gpt4 book ai didi

python - 文档内架构声明和 lxml

转载 作者:数据小太阳 更新时间:2023-10-29 02:32:40 24 4
gpt4 key购买 nike

根据 lxml 的官方文档,如果要根据 xml 模式文档验证 xml 文档,则必须

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

可能会有变体,但无论您如何操作,本质都几乎相同,- 架构是“外部”指定的(与在实际 xml 文档中指定它相反)。

如果您遵循此过程,肯定会进行验证,但如果我理解正确,那将完全忽略 xsi 中的 schemaLocation 和 noNamespaceSchemaLocation 属性的整个概念。

这引入了一大堆限制,首先是您必须自己处理实例<->架构关系(要么将其存储在外部,要么编写一些 hack 以从根元素检索架构位置实例文档),您不能使用多个模式(例如,当每个模式管理其自己的命名空间时)等来验证文档。

所以问题是:也许我遗漏了一些完全微不足道的东西或做错了什么?或者我关于 lxml 在模式验证方面的限制的说法是否正确?

总而言之,我希望能够:

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

也许我应该找一个不同的库?虽然,这真的很遗憾,- lxml 是一个事实上的 python xml 处理库,并且在性能/功能/便利性方面被所有人认为是最好的(在某种程度上这是理所当然的)

最佳答案

注意:这不是对此的完整答案,因为我对 lxml 特别了解不多。

In 可以告诉你:

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

关于python - 文档内架构声明和 lxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com