Декларации схемы в документе и lxml - PullRequest
3 голосов
/ 05 июня 2010

Согласно официальной документации lxml, если кто-то хочет проверить документ xml по документу схемы xml, он должен

  1. создание объекта XMLSchema (в основном, анализ документа схемы)
  2. создает XMLParser, передавая объект XMLSchema в качестве аргумента schema
  3. парсинг фактического XML-документа (экземпляра документа) с использованием созданного парсера

Могут быть вариации, но суть в значительной степени одинакова, независимо от того, как вы это делаете, - схема указывается «внешне» (в отличие от указания ее внутри фактического документа XML).

Если вы следуете этой процедуре, проверка, конечно же, происходит, но если я правильно понимаю, это полностью игнорирует идею атрибутов schemaLocation и noNamespaceSchemaLocation из xsi

Это вводит целый ряд ограничений, начиная с того факта, что вам приходится самостоятельно иметь дело с отношением схемы <-> экземпляра (либо сохранить его внешне, либо написать какой-нибудь хак, чтобы получить местоположение схемы из корневого элемента экземпляр документа), вы не можете проверить документ, используя несколько схем (скажем, когда каждая схема управляет своим собственным пространством имен) и т. д.

Так что вопрос: может быть, я упускаю что-то совершенно тривиальное или делаю это неправильно? Или мои утверждения об ограничениях lxml в отношении проверки схемы верны?

Напомним, я бы хотел:

  • чтобы синтаксический анализатор использовал объявления расположения схемы в экземпляре документа во время разбора / проверки
  • использовать несколько схем для проверки XML-документа
  • объявление местоположения схемы на некорневых элементах (не особо важных)

Может быть, мне стоит поискать другую библиотеку? Хотя, это было бы настоящим позором, - lxml является де-факто библиотекой обработки xml для python и рассматривается всеми как лучшая с точки зрения производительности / возможностей / удобства (и вполне справедливо в определенной степени)

1 Ответ

3 голосов
/ 06 июня 2010

Внимание: это не полный ответ на этот вопрос, потому что я не очень много знаю об lxml в частности.

В может сказать, что:

  • Игнорирование расположения схем в документах и ​​вместо этого управление пространством имен -> отображение файла схемы в приложении почти всегда лучше , если только вы не можете гарантировать, что схема будет находиться в очень специфическом месте по сравнению с файлом. Если вы хотите переместить его из кода, используйте каталог или создайте файл конфигурации.
  • Если вы do хотите использовать schemaLocation и хотите проверить несколько схем, просто включите их все в один атрибут schemaLocation, разделенных пробелами, в пары URI / location пространства имен: xsi:schemaLocation="urn:schema1 schema1.xsd urn:schema2 schema2.xsd.
  • Наконец, я не думаю, что какой-либо процессор найдет атрибуты schemaLocation, объявленные для некорневых элементов. Не то, чтобы это имело значение: просто поместите их всех в корень.
...