Требуется ли действительный файл XML декларации XML?

101

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

  • 3
    Есть разница между действительными и правильно оформленными документами. Что из этого вы имеете в виду?
  • 0
    Я получаю ошибку пролога / неверную кодировку utf-8. Затем я нашел BOM в XML-файле, который пользователь открывает файл с помощью блокнота (я не могу избежать этого). я не уверен, что имею в виду действительные или правильно оформленные документы. Просто нужно избегать ошибок, поэтому я создаю функцию, которая удаляет все байты до "<". Что мне нужно, чтобы убедиться, что объявление XML-заголовка требуется. Что вы думаете, ребята?
Показать ещё 2 комментария
Теги:
xml-declaration

3 ответа

143
Лучший ответ

В 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.

Update:

Ошибка "ошибка прогона/недействительная ошибка 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 - настоящая проблема!

  • 0
    На мой вопрос был дан ответ, но мой следующий вопрос не был. Нужно ли мне создать еще один вопрос для этого? или, пожалуйста, добавьте это здесь.
  • 4
    Спецификация может быть причиной проблемы. Некоторые старые синтаксические анализаторы XML не принимают BOM в начале документа UTF-8 (он был разработан для UTF-16 и стал приемлемым только с UTF-8 позже). Но это вряд ли будет проблемой, если вы используете последнюю версию Xerces.
Показать ещё 1 комментарий
8

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню