Требуется ли для допустимого файла XML декларация XML?

122

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

Эрос
источник
3
Есть разница между действительными и правильно оформленными документами. Что из этого вы имеете в виду?
Феликс Клинг
Я получаю ошибку пролога / недопустимую кодировку utf-8. Затем я нашел спецификацию в XML-файле, который пользователь открывает с помощью блокнота (я не могу этого избежать). Я не уверен, что имею в виду действительные или правильно оформленные документы. Просто нужно избегать ошибок, поэтому я создаю функцию, которая удаляет все байты до «<». Что мне нужно, чтобы убедиться, что требуется объявление заголовка xml. Что вы думаете, ребята?
eros
Есть ли класс Java для удаления спецификации? или несколько байтов из файла xml? из InputStream. Я думаю о методе пропуска из FilterInputStream и PushbackInputStream, но не знаю, как его использовать.
eros
@eros: « Я не уверен, что имею в виду действительные или правильно сформированные документы » См. « Правильный формат и действительный XML» для краткого объяснения разницы.
kjhughes

Ответы:

184

В 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 - настоящая проблема!

Hoylen
источник
На мой вопрос был дан ответ, а на мой последующий вопрос - нет. Мне нужно для этого создать еще один вопрос? или добавьте его сюда.
eros
5
Спецификация может быть причиной проблемы. Некоторые старые анализаторы XML не принимают спецификацию в начале документа UTF-8 (она была разработана для UTF-16 и стала приемлемой только с UTF-8 позже). Но вряд ли это будет проблемой, если вы используете последнюю версию Xerces.
Майкл Кей
Также обратите внимание, что в диалоговом окне «Сохранить как» в блокноте вы можете выбрать кодировку для сохранения вашего XML. Если вы хотите удалить спецификацию, просто сохраните ее как «ASCII» (при условии, что вы не используете символы Unicode). Для нижних 127 символов ASCII и UTF-8 идентичны.
BrainSlugs83
8

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

Аравинд Яррам
источник
3
Я единственный, кому кажется странным, что вы указываете синтаксическим анализаторам XML, какую кодировку использовать после того, как они уже начали декодировать ваш документ? Я имею в виду, что если он может проанализировать этот тег и понять, что он говорит, значит, он уже определил правильную кодировку. Я не могу придумать никакого законного использования атрибута кодирования.
BrainSlugs83
2
@ BrainSlugs83 В спецификации не указано 8-битное кодирование. Так что либо ASCII, либо UTF-8, либо любая из них старая 8-битная национальная кодировка. Объявление XML представляет собой 8-битную нижнюю половину, которая одинакова для всех этих кодировок и передает достаточно информации, чтобы выбрать верхнюю половину. Не самый лучший дизайн, но все же лучше, чем угадывать, скажем, между CP1241 и CP866, как это было обычно для текстовых файлов в прежние времена.
Евгений Рябцев
Но они должны были пойти честно и сказать, что XML - это UTF-8 - конец истории.
Lothar
3

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

Quentin
источник