Почему XML проверяется только на соответствие XSD, если lxml etree.ElementTree является строкой? - PullRequest
1 голос
/ 05 ноября 2019

У меня есть XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://tempuri.org/me"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://tempuri.org/me">

    <xs:element name="B"></xs:element>

</xs:schema>

Используя lxml, я могу создать XML-документ и проверить его по XSD:

path = os.path.join(os.path.dirname(__file__), 'sample.xsd')
schema = etree.XMLSchema(file=path)

el = etree.Element('B', nsmap={None: 'http://tempuri.org/me'})
doc = etree.ElementTree(el)

schema.assertValid(doc)

Однако выдается следующая ошибка:

lxml.etree.DocumentInvalid: Element 'B': No matching global declaration available for the validation root.

Эта ошибка не произойдет, если я преобразую doc в строку и верну обратно:

st = etree.tostring(doc)
schema.assertValid(etree.XML(st)) # This validates.

Что здесь происходит? Почему мне нужно преобразовать мой документ etree в строку и обратно, чтобы она прошла валидацию? Как я могу предотвратить этот расточительный шаг?

Я использую Python 3.8 и lxml 4.4.1.

...