Для начала разберемся в терминах. Раздел 2.8 Рекомендации W3C по XML 1.0 в частности гласит:
XML-документы ДОЛЖНЫ начинаться с объявления XML, в котором определяется версия используемого XML.
Слово "ДОЛЖНЫ" формально является термином RFC 2119, определенным следующим образом:
Данное слово, или прилагательное "РЕКОМЕНДУЕМЫЙ" означает, что в отдельных обстоятельствах могут существовать веские причины, для игнорирования указанных правил, однако перед выбором этого пути все последствия должны быть поняты и тщательно взвешены.
Многие эксперты в области XML, в том числе и автор статьи, придерживаются строгого мнения и считают, что опускать XML объявление никогда нельзя. Оно предоставляет важную информацию об основах синтаксиса XML-документа. Если вы будете полагаться на значения установленные по умолчанию, можно стать жертвой непредвиденных ошибок.
Объявление XML имеет следующий вид:
<?xml <i>version </i> <i>opt._encoding </i> <i>opt._standalone</i>?> |
Эти три ключевых части объявления XML иногда еще называют псевдо-атрибутами, из-за того, что они выглядят синтаксически как атрибуты. Объявление кодировки, если таковое существует, должно следовать за объявлением версии XML. Затем должно следовать объявление “автономности” XML (standalone).
Объявление версии XML является особенно важным теперь, когда стандарт XML 1.1 был утвержден как Рекомендованный W3C. В версии XML 1.1 определение правильно сформированного документа слегка изменено. Одним из таких изменений является то, что XML 1.1 указывает на обязательность объявления XML. Рекомендация W3C гласит:
Документы XML версии 1.1 ДОЛЖНЫ начинаться с объявления XML, которое определяет версию используемого XML.
Мы выделили здесь слово «должны». Согласно данному определению, любой XML-документ без объявления XML является документом XML 1.0. Кроме этого, версию XML нужно указывать по причине того, что она является очень важной при определении кодировки.
Основной кодировкой XML является Unicode. Каждый символ в XML-документе является символом Unicode. Если вы запомните этот факт, вам не придется выбирать. Наиболее важным моментом, если не сказать фактом, является то, что все непустые элементы обязаны иметь открывающий и закрывающий тег. Символ Unicode является абстракцией, поэтому должен существовать некий механизм для представления символов Unicode в форме, удобной для обработки. Такая форма и называется кодировкой. Кодировка документа является лишь удобством для передачи документа, однако вы должны четко понимать, что сущность XML-контента по-прежнему ограничена Unicode. Перевод из кодировки в Unicode является задачей парсера.
Самыми распространенными кодировками являются UTF-8 и UTF-16, которые передают символы Unicode, соответственно, как последовательность 8-битных и 16-битных значений. Обе эти кодировки должны поддерживаться парсерами. Если кодировка не задана, обработчик XML подразумевает, что используется кодировка UTF-8 или UTF-16 в зависимости от наличия или отсутствия в самом начале обрабатываемого файла особой последовательности байт (называемой Byte Order Mark или BOM).
Одной из часто встречающихся мне проблем при обработке XML была ситуация, когда объявление XML отсутствовало, а автор XML-документа пытался использовать полный набор символов в кодировке LATIN-1 (ISO-8859-1), так популярной в Америке и Западной Европе. Обычно BOM не присутствует и обработчик XML подразумевает, что используется кодировка UTF-8. В лучшем случае в такой ситуации парсер выдаст набор байт, который сформирует неверную последовательность UTF-8 и пользователь, по крайней мере, получит чистую ошибку форматирования документа. Худшим случаем является тот, когда символы кодировки LATIN-1, встречающиеся случайно, формируют правильную последовательность UTF-8. В этом случае парсер не выдаст ошибки форматирования документа, а символы XML могут оказаться совсем не тем, что вам нужно. Такую разновидность скрытой ошибки довольно сложно отследить в системе производства.
Если система внедряет правило, что все XML-документы должны иметь объявление XML, включающее кодировку, то все файлы, содержащие кодировку LATIN-1 должны всегда начинаться со следующей строки:
<?xml version="1.0" encoding="LATIN-1"?> |
В этом случае явная или скрытая ошибка неправильного предположения кодировки UTF-8 не появится. Такая форма (с правильным указанием версии XML и кодировки) является минимальным объявлением XML, настоятельно рекомендованным к использованию во всех XML-файлах. Вообще, следует объявлять кодировку в любом случае, даже если она является одной из заданных по умолчанию (UTF-8 или UTF-16).
Примечание: Файл, использующий кодировку UTF-16 должен начинаться с последовательности BOM, даже если кодировка объявлена правильно.
В этом объявлении XML указывается, содержит ли внешнее подмножество DTD какие-либо объявления, которые могут повлиять на текущее содержимое документа. Разумеется, это имеет значение только тогда, когда вы используете DTD.
Существует распространенное мнение многих программистов о том, что явное определение всегда лучше определения по умолчанию. Это особенно верно в случае с объявлением XML. Мы настоятельно рекомендуем вам принять простое правило, что все XML-документы должны содержать объявление XML, включающее указание кодировки документа. Как показывает опыт, использование такой политики позволяет минимизировать скрытые ошибки XML и к тому же не причиняет особых неудобств.
- Оригинальная статья "Always use an XML declaration"
- Документ RFC 2119: "Key words for use in RFCs to Indicate Requirement Levels", определяющий специальные термины, используемые во многих спецификациях.
- Полные рекомендации W3C по XML 1.0 (третье издание) и XML 1.1.
- Спецификация XML 1.0 в документе Annotated XML 1.0 Specification (Автор: Tim Bray). В ней, к сожалению, не описано последнее (третье) издание XML 1.0.
- Руководство "skew.org XML Tutorial" (Автор: Mike Brown). Представляет собой "введение в XML с акцентом на использовании кодировок". Модель символов ядра XML является наиболее непонятным для многих аспектом, поэтому вам следует хорошенько разобраться в основах XML.
- Большое количество статей, руководств и советов ресурса developerWorks в разделах Web services и XML.
- Книжный магазин Developer Bookstore ресурса developerWorks с огромным выбором книг по XML.
- Узнайте о том, как стать Cертифицированным Разработчиком IBM в области XML и родственных технологиях.
- Ссылки по теме:
A survey of XML standards
Introduction to XML

Uche Ogbuji является консультантом и соучредителем фирмы Fourthought Inc., поставляющей программное обеспечение и осуществляющей консультации. Его специализацией являются XML-решения для управления корпоративными знаниями. Фирма Fourthought разработала платформу с открытым кодом 4Suite для XML, RDF и приложений, управляющих знаниями. Автор также является ведущим разработчиком языка запросов RDF Versa, инженером в области вычислительной техники и техническим писателем. Родился в Нигерии, живет и работает в г.Боулдер, штат Колорадо. Связаться с ним можно по адресу: uche@ogbuji.net.