Является ли узел декларации XML обязательным? - PullRequest
15 голосов
/ 13 января 2011

У меня была дискуссия с моим коллегой об узле объявления XML (я говорю об этом => <?xml version="1.0" encoding="UTF-8"?>).

Я считаю, что для того, чтобы что-то называлось "допустимым XML",для этого требуется узел объявления XML.

Мой коллега утверждает, что узел объявления XML является необязательным, поскольку кодировка по умолчанию - UTF-8, а версия всегда 1.0.Это имеет смысл, но что говорит стандарт?

Короче говоря, учитывая следующий файл:

<books>
  <book id="1"><title>Title</title></book>
</book>

Можем ли мы сказать, что:

  1. Этодействительный XML?
  2. Это действительный узел XML?
  3. Это действительный документ XML?

Большое спасибо.

Ответы [ 4 ]

32 голосов
/ 13 января 2011

Это:

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

- это не инструкция обработки - это XML-объявление . Его цель - правильно настроить синтаксический анализатор XML, прежде чем он начнет читать остальную часть документа.

Это похоже на инструкцию обработки, но, в отличие от реальной инструкции обработки, она не будет частью DOM, которую создает анализатор.

Это не обязательно для "valid" XML. «Действительный» означает «представляет четко определенный тип документа, как описано в DTD или схеме» . Без схемы или DTD слово «действительный» не имеет смысла.

Многие люди неправильно используют «действительный» , когда они действительно означают «правильно сформированный» . Правильно сформированный XML-документ - это документ, который подчиняется основным синтаксическим правилам XML.

Для правильной формы документа также не требуется декларация XML, поскольку существуют значения по умолчанию для version и encoding (1.0 и UTF-8 / UTF-16 соответственно). Если в файле присутствует Unicode BOM (Byte Order Mark), она определяет кодировку. Если нет спецификации и декларации XML, предполагается UTF-8.

Вот канонический поток о том, как объявление и обнаружение кодировки работает в файлах XML. Как используется кодировка по умолчанию (UTF-8) в декларации XML?


На ваши вопросы:

  1. Это действительно XML?
    На это нельзя ответить без DTD или схемы. Это хорошо сформировано, хотя.
  2. Это действительный узел XML?
    Узел - это концепция, связанная с представлением документа в памяти (DOM). Этот фрагмент можно разобрать в узел, так как он правильно сформирован.
  3. Это действительный документ XML?
    См. № 1.

Вы путаете несколько концепций XML здесь (не волнуйтесь, это заблуждение является распространенным и частично связано с тем фактом, что понятия частично совпадают, а имена используются неправильно довольно часто).

  • Все начинается с структурированных данных , состоящих из имен, значений и атрибутов, организованных в виде дерева.
  • XML означает, в основном, синтаксис для представления этих структурированных данных в текстовой форме (это «Язык разметки»). Это то, что вы получаете, когда вы сериализуете дерево в строку символов, и его можно использовать для десериализации строки символов в дереве снова.
  • Документ обычно относится к строке символов, представляющих сериализованное дерево. Его можно сохранить в файл, отправить по сети или создать в памяти.
  • Правила сериализации и десериализации очень строго определены. Документ («строка символов»), который можно успешно десериализовать в дерево, называется правильно сформированным .
  • Семантика такого дерева (допустимые элементы, количество элементов и порядок, пространства имен, любое количество сложных правил, на самом деле) может быть определена в так называемой DTD или схеме. Если дерево подчиняется определенному набору четко определенной семантики, оно называется valid .
  • Термин Объектная модель документа (DOM) относится к стандартизированному представлению в памяти структурированных данных. Это имя четко определенного API для доступа к этому дереву стандартными методами.
  • Узел - это базовая структура данных объектной модели документа.
2 голосов
/ 13 января 2011

Согласно расширяемому языку разметки (XML) 1.0 (пятое издание) Рекомендация W3C 26 ноября 2008 года, раздел: http://www.w3.org/TR/2008/REC-xml-20081126/#sec-prolog-dtd
без декларации xml он недействителен (хотя он правильно сформирован и завершен).

0 голосов
/ 13 января 2011

Обратите внимание, что срок действия зависит от DTD или схемы, связанной с документом.В вашем случае

<books>
  <book id="1"><title>Title</title></book>
</book>

минимальное значение DTD должно быть ELEMENT "books", "book" и "title", и что "book" имеет ATTLIST с "id", определите тип«id» и является ли он обязательным или необязательным.Также было бы объявлено, что «книга» может / должна содержать «заголовок», а «заголовок» может (или должен) содержать содержимое (строку) PCDATA.

DTD может также объявить, что должны присутствовать некоторые другие элементы, и в этом случае ваш XML-документ будет недействительным.Есть много DTD, которые сделают ваш документ действительным, и много, которые сделают его недействительным.

0 голосов
/ 13 января 2011

спецификация гласит:

Определение: документы XML ДОЛЖНЫ начинаться с объявления XML, в котором указывается используемая версия XML.

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

...