gpt4 book ai didi

python - 使用三个 xml 模式作为 lxml 中的一个组合模式进行验证?

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

我正在生成一个 XML 文档,其中为不同的部分提供了不同的 XSD(也就是说,某些元素的定义在某些文件中,其他元素的定义在其他文件中)。

XSD 文件不相互引用。模式是:

  1. http://xmlgw.companieshouse.gov.uk/v2-1/schema/Egov_ch-v2-0.xsd
  2. http://xmlgw.companieshouse.gov.uk/v1-1/schema/forms/FormSubmission-v1-1.xsd
  3. http://xmlgw.companieshouse.gov.uk/v1-1/schema/forms/CompanyIncorporation-v1-2.xsd

有没有一种方法可以使用 lxml 针对所有模式验证文档?

这里的解决方案不是只是针对每个模式分别进行验证,因为我遇到的问题是由于 XSD 中未指定的元素导致验证失败。例如,当针对 http://xmlgw.companieshouse.gov.uk/v2-1/schema/Egov_ch-v2-0.xsd 进行验证时,我收到错误:

  File "lxml.etree.pyx", line 3006, in lxml.etree._Validator.assertValid (src/lxml/lxml.etree.c:125415)
DocumentInvalid: Element '{http://xmlgw.companieshouse.gov.uk}CompanyIncorporation': No matching global element declaration available, but demanded by the strict wildcard., line 9

因为有问题的文档包含一个 {http://xmlgw.companieshouse.gov.uk}CompanyIncorporation 元素,它没有在被验证的 XSD 中指定,而是在另一个元素中指定XSD 文件。

最佳答案

我相信你应该只针对 Egov_ch-v2-0.xsd 进行验证,它似乎定义了一个信封文档。 (这是您正在创建的文档,对吧?您还没有显示您的 XML。)

此模式使用 <xs:any namespace="##any" minOccurs="0"/>定义信封的正文内容。然而,xsd:any 不是意思是“忽略所有内容”。相反,它的意思是“在这里接受任何东西”。是否验证或忽略内容由 processContents 控制属性,默认为 strict .这意味着此处发现的任何元素必须针对架构可用的类型进行验证。然而,Egov_ch-v2-0.xsd不导入 CompanyIncorporation-v1-2.xsd , 所以它不知道 CompanyIncorporation元素,因此文档无法验证。

您需要添加 xsd:import将元素添加到您的主模式 ( Egov_ch-v2-0.xsd ) 以导入文档中可能使用的所有其他模式。您可以在 xsd 文件本身中执行此操作,也可以在解析后以编程方式添加元素:

xsd = lxml.etree.parse('http://xmlgw.companieshouse.gov.uk/v2-1/schema/Egov_ch-v2-0.xsd')
newimport = lxml.etree.Element('{http://www.w3.org/2001/XMLSchema}import',
namespace="http://xmlgw.companieshouse.gov.uk",
schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-1/schema/forms/CompanyIncorporation-v1-2.xsd")
xsd.getroot().append(newimport)

validator = lxml.etree.XMLSchema(xsd)

您甚至可以使用一个函数以通用方式执行此操作,该函数接受模式路径列表并返回 xsd:import 列表。带有 namespace 的语句和 schemaLocation通过解析设置targetNamespace .

(顺便说一句,您可能应该下载这些架构文档并使用文件系统路径引用它们,而不是通过网络加载它们。)

关于python - 使用三个 xml 模式作为 lxml 中的一个组合模式进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9523887/

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