Требуется ли действительный файл XML декларации XML? - PullRequest
112 голосов
/ 10 августа 2011

Я анализирую XML-файл, используя Sax Parser of Xerces.
Требуется ли декларация XML <?xml version="1.0" encoding="UTF-8"?>?

Ответы [ 3 ]

169 голосов
/ 10 августа 2011

В XML 1.0 декларация XML является необязательной . См. раздел 2.8 Рекомендации XML 1.0 , где говорится, что его «следует» использовать - это означает, что это рекомендуется, но не обязательно. Однако в XML 1.1 декларация является обязательной . См. раздел 2.8 Рекомендации XML 1.1 , где говорится, что «ДОЛЖЕН» использоваться. Далее даже утверждается, что , если декларация отсутствует, это автоматически означает, что документ является документом XML 1.0.

Обратите внимание, что в XML-декларации encoding и standalone являются необязательными. Только version является обязательным. Кроме того, это не атрибуты, поэтому, если они присутствуют, они должны быть в таком порядке: version, затем любой encoding, затем любой standalone.

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>

Если вы не укажете кодировку таким образом, парсеры XML попытаются угадать, какая кодировка используется. Рекомендация XML 1.0 описывает один из возможных способов автоматического определения кодировки символов . На практике это не составляет большой проблемы, если вход кодируется как UTF-8, UTF-16 или US-ASCII. Автоопределение не работает, когда встречаются 8-битные кодировки, которые используют символы вне диапазона US-ASCII (например, ISO 8859-1) - избегайте их создания, если можете.

standalone указывает, может ли документ XML быть правильно обработан без DTD или нет. Люди редко используют это. В наши дни плохо проектировать формат XML, в котором отсутствует информация без DTD.

Обновление:

«Ошибка пролога / недопустимая кодировка utf-8» указывает на то, что фактические данные, найденные анализатором внутри файла, не соответствуют кодировке, указанной в объявлении XML. Или, в некоторых случаях, данные внутри файла не соответствуют автоматически определяемой кодировке.

Поскольку ваш файл содержит метку порядка байтов (BOM), он должен быть в кодировке UTF-16. Я подозреваю, что в вашем объявлении написано <?xml version="1.0" encoding="UTF-8"?>, что, очевидно, неверно, когда файл был изменен на UTF-16 с помощью NotePad. Простое решение состоит в том, чтобы удалить encoding и просто сказать <?xml version="1.0"?>. Вы также можете отредактировать его так, чтобы оно показывало encoding="UTF-16", но это было бы неправильно для исходного файла (которого не было в UTF-16) или если файл каким-либо образом был изменен на UTF-8 или какую-либо другую кодировку.

Не пытайтесь удалить спецификацию - это не является причиной проблемы. Использование NotePad или WordPad для редактирования XML - настоящая проблема!

8 голосов
/ 10 августа 2011

Объявление XML не является обязательным, поэтому ваш XML хорошо сформирован без него. Но рекомендуется использовать его, чтобы синтаксические анализаторы не делали неправильных предположений, в частности, об используемой кодировке.

3 голосов
/ 10 августа 2011

Требуется только в том случае, если вы не используете значения по умолчанию для version и encoding (которые вы в этом примере).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...