6. Xранилище xml и проверка данных
Прекрасным способом избежать проблем, связанных с повреждением данных, является хранение данных в формате XML. Хотя язык XML изначально предназначался для Web–страниц, книг, поэм, статей и подобных документов, он нашел широкое применение практически во всех областях, начиная с финансовых данных и заканчивая векторной графикой и последовательными объектами.
Основной характеристикой, которая делает XML–форматы устойчивыми к искажению данных, является то, что анализатор XML не делает никаких предположений о входных данных.
Это именно то, что нужно для надежного формата файлов. Синтаксические анализаторы XML спроектированы таким образом, что любые входные данных (правильно сформированные или неправильно, верные или нет) обрабатываются строго определенным способом. Синтаксический анализатор XML может обрабатывать любой поток байтов. Если данные сначала проходят через синтаксический анализатор XML, то достаточно быть готовым к тому, что может передать анализатор. Например, вам не нужно проверять данные на наличие null–символов, поскольку анализатор XML никогда их не передаст. Если синтаксический анализатор XML видит во входных данных такой символ, он обрабатывает эту исключительную ситуацию и прекращает обработку данных. Конечно, вам по–прежнему нужно обрабатывать эту исключительную ситуацию, но написать блок catch для обработки обнаруженной ошибки гораздо проще, чем писать код для обнаружения всех возможных ошибок.
В качестве дополнительных мер безопасности можно проверить документ с помощью DTD и/или схемы. Это проверка не только того, что XML правильно сформирован, но и того, что файл, как минимум, близок к ожидаемому. Такая проверка редко скажет вам все, что нужно знать о документе, но она облегчает написание большого количества простых проверок. С помощью XML очень просто строго ограничить принимаемые документы теми форматами, которые вы можете хорошо обрабатывать.
Однако по–прежнему найдутся части кода, которые невозможно проверить с помощью DTD или схемы. Например, нельзя таким образом проверить, совпадает ли цена в счете с ценой этого же товара в инвентаризационной базе данных. При получении от клиента заказа, который содержит цену в XML или любом другом формате, всегда необходимо проверять, что заказчик не изменил цену при ее указании в документе. Однако эти последние проверки можно реализовать с помощью специального кода.