Чи потрібний дійсний XML-файл декларації XML?


122

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


3
Існує різниця між дійсними та добре сформованими документами. Який із них ви маєте на увазі?
Фелікс Клінг

Я отримую помилку prolog / недійсне кодування utf-8. Тоді я знайшов BOM у XML-файлі, який користувач відкриває файл за допомогою блокнота (я не можу цього уникнути). я не впевнений, що я маю на увазі дійсні або добре сформовані документи. Просто потрібно уникати помилок, тому я створюю функцію, яка видаляє всі байти до "<". Що мені потрібно, щоб переконатися, що декларація заголовка xml потрібна. Як ви думаєте, хлопці?
ерос

Чи існує клас java для видалення BOM? або кілька байт з файлу xml? від InputStream. Я думаю про пропустити метод від FilterInputStream & PushbackInputStream, але не маю уявлення про те, як ним користуватися.
ерос

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

Оновлення:

Помилка "помилка prolog / недійсне кодування utf-8" вказує на те, що фактичні дані аналізатора, знайдені всередині файлу, не відповідали кодуванню, за яким у декларації XML йдеться. Або в деяких випадках дані, що знаходяться у файлі, не відповідали автоматично виявленому кодуванню.

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

Не турбуйтеся намагатися видалити BOM - це не причина проблеми. Використання NotePad або WordPad для редагування XML - справжня проблема!


На моє запитання відповіли, але на моє наступне питання не було. Чи потрібно для цього створити ще одне питання? або, будь ласка, додайте їх тут
ерос

5
BOM може бути причиною проблеми. Деякі старші XML-аналізатори не приймуть BOM на початку документа UTF-8 (він був розроблений для UTF-16 і став прийнятним лише для UTF-8 пізніше). Але це навряд чи буде проблемою, якщо ви використовуєте останню версію Xerces.
Майкл Кей

Також зауважте, що в діалоговому вікні "Зберегти як" у блокноті ви можете вибрати, в якому кодуванні зберегти свій XML. Якщо ви хочете видалити BOM, просто збережіть як "ASCII" (припустимо, що ви не використовуєте жодних символів Unicode). Для нижніх 127 символів ASCII та UTF-8 однакові.
BrainSlugs83

8

Декларація Xml не є обов'язковою, тому ваш xml добре сформований без неї. Але рекомендується використовувати його так, щоб парсери не робили помилкових припущень, зокрема про використовуване кодування.


3
Чи я єдиний, хто вважає його дивним, що ви кажете XML-аналізаторам, яке кодування використовувати після того, як вони вже почали розшифровувати ваш документ? Я маю на увазі чітко, якщо він може розібрати цей тег і зрозуміти, що він говорить, то він вже з'ясував правильне кодування. Я не можу придумати жодного законного використання атрибута кодування.
BrainSlugs83

2
@ BrainSlugs83 У BOM ​​не вказано, що кодування є 8-бітним. Отже, або ASCII, або UTF-8, або будь-яке з них старе 8-бітове національне кодування. Декларація XML - це 8-бітна нижня половина, що є рівним серед усіх цих кодувань і передає достатню кількість інформації для вибору верхньої половини. Не найкращий дизайн, але все ж краще, ніж здогадуватися між, скажімо, CP1241 і CP866, як це було звичайно для текстових файлів старих днів.
Євген Рябцев

Але вони повинні були очиститись і сказати, що XML - це UTF-8 - кінець історії.
Лотар

3

Це потрібно лише у тому випадку, якщо ви не використовуєте значення за замовчуванням для versionта encoding(які ви є в цьому прикладі).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.