У меня есть 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.