Роль DOCTYPE в общем XML

Я знаю назначение DOCTYPE (и то, что представляет собой каждый URL/идентификатор в строке) в том, что касается веб-стандартов и проверки страниц, но я не уверен в том, что это на самом деле "является" в контексте XML-документа.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>My Page</title>
  </head>
  <body>
    <p>Hello</p>
  </body>
</html>

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

Каково значение "!" перед именем? Означает ли это особый тип «элемента»? Как они называются?

Пример, который я опубликовал, - это XHTML для Интернета, но используется ли DOCTYPE также в XML-документах общего назначения?


person xyz    schedule 30.07.2009    source источник


Ответы (2)


DOCTYPE был «унаследован» от SGML (предполагалось, что он указывает на файл DTD, который объясняет, как анализировать файл), однако понятный синтаксис XML и пространства имен сделали его в значительной степени неуместным. Единственное реальное применение DOCTYPE/DTD в XML — определение разрешенных именованных сущностей (например, &nbsp;).

Спецификация XML даже допускает «непроверяющие» синтаксические анализаторы, которые полностью игнорируют файл DTD (веб-браузеры используют такие синтаксические анализаторы, если только вы не попали в ловушку text/html, и в этом случае синтаксический анализатор XML вообще не используется).

DTD довольно плохой для целей проверки (сложно указать правила для более чем одного уровня вложенности, нет возможности указать типы атрибутов за пределами нескольких предопределенных типов). Схема, RelaxNG может быть гораздо точнее.

DTD также не полностью поддерживает пространства имен, что приводит к нелепым обходным путям, таким как XHTMLplusMathMLplusSVG DOCTYPE.

В веб-браузерах некоторые DOCTYPE имеют желательный побочный эффект включение режима рендеринга, соответствующего стандартам. Это скорее хак, чем предполагалось использовать DOCTYPE.

  • Если вы используете настоящий XHTML (application/xhtml+xml — тот, который вообще не открывается в IE), то вообще не используйте DOCTYPE (это рекомендация из XHTML 5). Режим XML запускает рендеринг в соответствии со стандартами независимо от DOCTYPE.

  • Если вы используете режим text/html, используйте <!DOCTYPE html>. Это HTML 5 DOCTYPE, и он самый короткий, который обеспечивает наилучший рендеринг во всех браузерах. Браузеры не используют DOCTYPE ни для каких других целей, так что вы ничего не упустите.

  • Если вы обрабатываете файлы XHTML с помощью синтаксических анализаторов XML (вне браузеров), пожалуйста, не забудьте правильно настроить каталог DTD, иначе ваш синтаксический анализатор может быть DoS-атака w3.org каждый раз пытается получить DTD. Если вы не можете использовать каталог DTD, отключите «внешние» в синтаксическом анализаторе или опустите DOCTYPE и не используйте именованные объекты (т. е. используйте &#160; вместо &nbsp;)

person Kornel    schedule 30.07.2009
comment
Настоящий XHTML == application/xhtml+xml? Сегодняшний XHTML по-прежнему 1.1 и поэтому требует DOCTYPE, верно? - person xyz; 31.07.2009
comment
@frou: да, XHTML обрабатывается как XML только в application/xhtml+xml. Строгое соответствие XHTML 1.1 действительно требует DOCTYPE. - person Kornel; 31.07.2009

DOCTYPE является частью спецификации XML (см. соответствующий подраздел здесь ) и может включать ссылку на DTD, "внутренние" объявления DTD или и то, и другое. Многие «современные» применения XML вообще не используют DOCTYPE — как упоминает porneL, и XML Schema, и RelaxNG — более мощные способы определения синтаксиса документа. См. эту запись в блоге Тима Брея. для немного больше фона.

person Greg Campbell    schedule 30.07.2009
comment
Он является частью XML, поскольку является частью SGML, а XML — это форма SGML. - person John Saunders; 31.07.2009
comment
Я думал, что есть какое-то серьезное совпадение (я использовал XSD не в Интернете) - person xyz; 31.07.2009