Я полагаю, что вы должны проверять только по 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
.
(Кроме того, вы, вероятно, должны загрузить эти документы схемы и ссылаться на них с путями файловой системы, а не загружатьих по сети.)