Согласно официальной документации lxml, если кто-то хочет проверить документ xml по документу схемы xml, он должен
- создание объекта XMLSchema (в основном, анализ документа схемы)
- создает XMLParser, передавая объект XMLSchema в качестве аргумента
schema
- парсинг фактического XML-документа (экземпляра документа) с использованием созданного парсера
Могут быть вариации, но суть в значительной степени одинакова, независимо от того, как вы это делаете, - схема указывается «внешне» (в отличие от указания ее внутри фактического документа XML).
Если вы следуете этой процедуре, проверка, конечно же, происходит, но если я правильно понимаю, это полностью игнорирует идею атрибутов schemaLocation и noNamespaceSchemaLocation из xsi
Это вводит целый ряд ограничений, начиная с того факта, что вам приходится самостоятельно иметь дело с отношением схемы <-> экземпляра (либо сохранить его внешне, либо написать какой-нибудь хак, чтобы получить местоположение схемы из корневого элемента экземпляр документа), вы не можете проверить документ, используя несколько схем (скажем, когда каждая схема управляет своим собственным пространством имен) и т. д.
Так что вопрос: может быть, я упускаю что-то совершенно тривиальное или делаю это неправильно? Или мои утверждения об ограничениях lxml в отношении проверки схемы верны?
Напомним, я бы хотел:
- чтобы синтаксический анализатор использовал объявления расположения схемы в экземпляре документа во время разбора / проверки
- использовать несколько схем для проверки XML-документа
- объявление местоположения схемы на некорневых элементах (не особо важных)
Может быть, мне стоит поискать другую библиотеку? Хотя, это было бы настоящим позором, - lxml является де-факто библиотекой обработки xml для python и рассматривается всеми как лучшая с точки зрения производительности / возможностей / удобства (и вполне справедливо в определенной степени)