12. Автоматическая проверка входных файлов¶
Что происходит с вашим приложением, если вы читаете файл, который не соответствует схеме? Существует два способа обработки ошибок.
Если вы являетесь осторожным и защищенным программистом, вы всегда будете проверять наличие и достоверность каждой части XML-документа, который вы читаете, и выпустить соответствующее сообщение об ошибке. Если вы недостаточно осторожны или достаточно защищены, ваше приложение может потерпеть крах.
Это может сделать ваше приложение намного проще, если вы механически проверяете входной файл на схему, которая определяет документ.
В модуле lxml последний подход является недорогим как в процессе программирования, так и во время выполнения. Вы можете проверить документ, используя любой из этих основных языков схемы:
- Раздел 12.1, «Проверка с помощью схемы Relax NG».
- Раздел 12.2, «Проверка с помощью схемы XSchema (XSD)».
12.1. Проверка с помощью схемы Relax NG¶
Модуль lxml может проверять документ в виде ElementTree на схему, выраженную в нотации Relax NG. Для получения дополнительной информации о Relax NG см. Relax NG Compact Syntax (RNC).
Схема Relax NG может использовать две формы: компактный синтаксис (RNC) или тип документа XML (RNG). Если ваша схема использует RNC, вы должны перевести ее в формат RNG. Утилита trang делает это преобразование для вас. Используйте команду этой формы:
trang file.rnc file.rng
После того, как у вас есть схема, доступная как файл .rng, используйте эти шаги для правильного дерева элементов ET.
- Разберите файл .rng в свой собственный ElementTree, как описано в разделе 7.3 «Конструктор ElementTree ()».
Используйте конструктор etree.RelaxNG(S) для преобразования этого дерева в «экземпляр схемы», где S - это экземпляр ElementTree, содержащий схему, с предыдущего шага.
Если дерево не является допустимой схемой Relax NG, конструктор будет вызывать исключение etree.RelaxNGParseError.
Используйте метод .validate(ET) экземпляра схемы для проверки ET.
Этот метод возвращает 1, если ET проверяет схему, или 0, если это не так.
Если метод возвращает 0, экземпляр схемы имеет атрибут с именем .error_log, содержащий все ошибки, обнаруженные экземпляром схемы. Вы можете распечатать .error_log.last_error, чтобы увидеть самую последнюю обнаруженную ошибку.
Ниже в этом документе представлены два примера использования этой методики валидации:
- Раздел 15, «rnc_validate: модуль для проверки XML по схеме Relax NG».
- Раздел 16, «rnck: автономный скрипт для проверки XML по схеме Relax NG».
12.2. Проверка с помощью схемы XSchema(XSD)
Чтобы проверить документ на схему, написанную на языке XSchema, выполните шаги, показанные в разделе 12.1 «Проверка с помощью схемы Relax NG», с одним изменением.
Вместо использования etree.RelaxNG() для анализа дерева схемы S используйте команду etree.XMLSchema(S).