Определение типа документа

редактировать
Набор объявлений разметки, определяющий тип документа для языка разметки семейства SGML

A определение типа документа (DTD ) - это набор объявлений разметки, которые определяют тип документа для SGML -семейства языка разметки (GML, ML SG, XML, HTML ).

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

XML использует подмножество SGML DTD.

Начиная с 2009 г., более новое пространство имен XML поддерживает языки схемы (например, W3C XML Schema и ISO RELAX Н.Г. ) в степени вытеснили DTD. Версия DTD с поддержкой пространства имен размещается как часть 9 ISO DSDL. DTD сохраняются в приложениях, требуются специальные символы публикации, такие как XML и ссылки на символы HTML, которые получены из более крупных наборов, как исполненная часть по стандарту ISO SGML.

Содержание
  • 1 Связывание DTD с документами
    • 1.1 Примеры
  • 2 Объявления разметки
    • 2.1 Объявления типов элементов
    • 2.2 Объявления списков атрибутов
    • 2.3 Объявления объектов
    • 2.4 Объявления нотаций
  • 3 XML DTD и проверка схемы
  • 4 Пример схемы XML DTD
  • 5 Безопасность
  • 6 См. Также
  • 7 Ссылки
  • 8 Внешние ссылки
Связывание DTD с документами

DTD связывается с документом XML или SGML через объявление типа документа (DOCTYPE). DOCTYPE появляется рядом с синтаксическим фрагментом doctypedecl с началом XML-документа. Объявление устанавливает, что документ является экземпляром типа DTD.

DOCTYPE составляют два вида объявлений:

  • необязательное внешнее подмножество
  • необязательное внутреннее подмножество.

Объявления во внутреннем подмножестве образуют часть DOCTYPE самом в документе. Объявления во внешнем подмножестве находятся в отдельном текстовом файле. На внешнее подмножество можно ссылаться через открытый идентификатор и / или системный идентификатор. Программы для чтения документов могут не потребоваться для чтения внешнего подмножества.

Любой допустимый документ SGML или XML, который содержит ссылки на проанализированные внешние сущности, объявленные в его DTD (включая те, которые объявлены в его внутреннем подмножестве), может быть проанализирован только частично, но не могут быть проанализированы путем проверки синтаксических анализаторов SGML или XML в их автономном режиме (это означает, что эти проверяющие синтаксические анализаторы не пытаются получить эти внешние сущности, и их текст замены недоступен).

Однако такие документы могут быть проанализированы в автономном режиме проверки парсеров, которые могут найти эти внешние объекты с указанным общедоступным указателем (FPI) или системный идентификатор (URI), либо недоступны. (Обозначения, объявленные в DTD, также упомянутые на внешних сущностях, но эти не требуются для проверки документов в автономном режиме этих синтаксических анализаторов: проверка всех внешних сущностей, на которые представлены нотации, предоставленные, использующие SGML или XML-парсер). В конечном итоге, непроверяющие синтаксические анализаторы могут попытаться найти эти внешние объекты в автономном режиме (путем частичной интерпретации DTD только для разрешения объявленных анализируемых объектов), но не проверяют модель содержимого этих документов.

Примеры

Следующий пример DOCTYPE содержит как общедоступные, так и системные индикаторы:

Все документы HTML 4.01 соответствуют одному из трех DTD SGML. Открытые соединения этих DTD являются постоянными и имеют следующий вид:

Системные механизмы этих DTD, если они присутствуют в DOCTYPE, являются ссылками на URI. Системный идентификатор обычно указывает на набор объявлений в разрешимом месте. SGML позволяет отображать общедоступные электронные системы в каталогах, необязательно доступны для преобразователей URI, используемым программным средством анализа документов .

Этот DOCTYPE может появляться только после необязательного объявления XML и перед телом документа, если синтаксис документа соответствует XML. Сюда входят документы XHTML :

...

Дополнительное внешнее внутреннее подмножество также может быть предоставлено после подмножества:

]>...

В качестве альтернативы только внутреннее подмножество может быть при условии :

]>...

Наконец, определение типа документа может вообще не входить подмножество; в этом случае он просто указывает, что документ имеет один элемент верхнего уровня (это не требование для всех допустимых документов XML и HTML, но не для фрагментов документа или всех документов SGML, элементы верхнего уровня которых могут отличаться из подразумеваемого корневого элемента), указывает имя типа корневого элемента:

...
Объявления разметки

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

Объявления разметки DTD объявляют, какие типы элементов, списки атрибутов, сущности и нотации разрешены в структуре соответствующего класса документов XML.

Объявления типа элемента

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

Различные элементы ключевых слов и символов определяют содержимое:

  • EMPTYдля указаний, что элементы не допускают содержимого, т. Е. Не может иметь никаких дочерних элементов, даже текстовых элементов (если есть пробелы, они игнорируются);
  • ЛЮБОЙдля указания того, что конкретный элемент допускает любое содержимое без ограничений, т. е. что он может иметь любое количество (включая отсутствие) и тип дочерних элементов (включая текстовые элементы);
  • или выражение, определяющее только элементы, разрешенные как прямые дочерние элементы в содержимом определенного элемента; это содержимое может быть либо:
    • a смешанным быть содержимым, что означает, что содержимое может быть по крайней мере один текстовый элемент и ноль или более именованных элементов, но порядок и количество в поисках не быть ограничены; это может быть:
      • (#PCDATA): исторически означающее проанализированные символьные данные, это означает, что в содержимом разрешен только один текстовый элемент (квантификатор не разрешен);
      • (#PCDATA | '' имя элемента '' |...) *: ограниченный выбор (в исключительном списке в круглых скобках и разделенных вертикальными символами «|» и завершенных обязательных символами « *«квантификатор) двух или более дочерних элементов (включая только текстовые элементы или именованные элементы) в любом количестве и количестве вхождений в контент.
    • элемент контента, что означает, что в дочерних элементах содержимого не должно быть текстовых элементов (все пробелы, закодированные между дочерними элементами, игнорируются, и комментарии). Такое содержимое элемента указывается как часть содержимого в варианте Бэкуса - Наура без оконечных символов и имен элементов как нетерминальных символов. Содержимое элемента состоит из:
      • a части содержимого может быть либо именем элемента, объявленным в DTD, либо списком последовательностей или списком выбора. За ним может следовать необязательный квантификатор.
        • a список последовательностей означает упорядоченный список (в круглых скобках и разделенный символом запятой ",") одной или ограниченной частью содержимого: все частицы должны располагаться как дочерние прямые элементы в определенном элементе в верхней позиции и относительном порядке;
        • a список выбора означает взаимоисключающий список (в круглых скобках и разделенный вертикальной чертой «|») из двух или нескольких частиц содержимого: только одна из этих частиц содержимого может находиться в содержимом определенного элемента в той.... же позиции.
      • A квантификатор - это одиночный символ, непосредственно который следует за указанным элементом, к которому он применяется, чтобы ограничить количество вхождений этих элементов в позиции в содержимом элемента; это может быть:
        • +для одного или нескольких инструкций, что должно быть одно или несколько инструкций - эффективное содержание каждого вхождения может быть разным;
        • *для определения того, что разрешено любое количество (ноль или более) вхождений - элемент является необязательным, и эффективное содержание каждого вхождения может быть разным;
        • ?для инструкций, что не должно быть одного вхождения - элемент является необязательным;
        • Если квантификатор отсутствует, один элемент должен произойти ровно раз в некоторых позициях в содержимом элемента.

Например:

Объявления типа элемента игнорируются непроверяющими синтаксическими анализаторами SGML и XML (в этих случаях любые элементы принимаются в любом порядке и в любом количестве экземпляров в проанализированном документе), но эти объявления все равно проверяются на предмет формы и действительности.

Объявления списка атрибутов

Список атрибутов определяет для данного типа элемента список всех атрибутов, связанных с этим типом. Для каждого возможного атрибута он содержит:

  • объявленное имя атрибута,
  • его тип данных (или перечисление его значений),
  • и его значение по умолчанию.

Например:

Вот некоторые типы атрибутов, поддерживаемые как SGML, так и XML:

CDATA
этот тип означает символьные данные и указывает, что действующим значением атрибута может быть любое текстовое значение, если только атрибут не указано как фиксированное (комментарии в DTD могут дополнительно документировать значения, которые принимаются, но синтаксис DTD не допускает такой точной спецификации);
ID
эффективное значение атрибута должно быть используемым средством, используемое для привязки к текущему элементу (включая фрагменты документа, которые могут быть указаны в конце URI после использования этого идентификатора "знак #"); это ошибка, если разные элементы в одном документе определяют один и тот же идентификатор; ограничение предполагает, что сам несет семантики и средства работы в приложениях как непрозрачные; XML также предопределяет стандартный псевдоэтим атрибут «xml: id» с этим типом, без какого-либо объявления в DTD, поэтому ограничения уникальности также применяются к определенному указатору, когда они указаны где-нибудь в XML-документе..
IDREFили IDREFS
эффективное значение атрибута может быть только действительным средством (или списком таких систем, разделенных пробелами) и ссылаться на уникальный элемент, определенным в документе. с определенным объявленным типом IDв DTD (или уникальным уникальным, определенным в документе XML с псевдо определенным атрибутом «xml: id»), значение которого тот же идентификатор;
NMTOKENили NMTOKENS
эффективное значение атрибута может быть только действительным токеном имени (или списком таких токенов, разделенных пробелами), но не ограничивается указателем в документе; это имя может нести дополнительные и зависящую от приложения семантику и может требовать дополнительных ограничений именования, но это выходит за рамки DTD;
ENTITYили ENTITIES
эффективное значение атрибута может быть только именем неанализируемой внешней сущности (или списком таких имен, разделенных пробелами), которое также быть объявлено в объявленном типа документа; этот тип не поддерживается в анализаторах HTML, но допустим в SGML и XML 1.0 или 1.1 (включая XHTML и SVG);
('' value1 '' |...)
эффективное значение атрибута может быть только одним из перечислимого списка (в круглыхках и разделенных вертикальной чертой «|») текстовых значений, где каждое значение в перечислении, возможно, указано между 'single 'или "двойные "кавычки, если это не простой токен имени;
NOTATION ('' notation1 '' |...)
эффективное значение атрибута может быть только из перечислимого списка (в круглых скобках и разделенных вертикальной чертой «|») имен нотаций, где также должно быть объявлено каждого нотации в перечислении в заявлении типа документа; этот тип не поддерживается в синтаксических анализаторах HTML, но допустим в SGML и XML 1.0 или 1.1 (включая XHTML и SVG).

Значение по умолчанию может определять, должны ли обнаруживаться (#REQUIRED) или нет (#IMPLIED), или имеет ли оно фиксированное значение (#FIXED), или какое значение следует использовать в качестве значения по умолчанию («…») в случае, если данный атрибут отсутствует в теге XML.

Объявления списка атрибутов игнорируются непроверяющими синтаксическими анализаторами SGML и XML (в этих случаях принимаются во всех элементов анализируемого документа), но эти объявления по-прежнему проверяются на правильность и достоверность.

Объявления сущностей

Сущность похожа на макрос. Объявление объекта присваивает ему значение, которое сохраняется во всем документе. Обычно используется для того, чтобы имя было более узнаваемым, чем числовая ссылка на незнакомый символ. Сущности улучшения читаемость текста XML. В общем, бывают двух типов: внутренние и внешние.

  • Внутренние (проанализированные) сущности связывают имя с любым произвольным текстовым содержимым, определенным в их объявлении (которое может быть во внутреннем подмножестве или во внешнем подмножестве DTD, объявленного в документе). Когда указанная ссылка на сущность документа (включая остальную часть DTD), то сама ссылка заменяется текстовым содержимым, определенным проанализированным объектом, и синтаксический анализ продолжается в этом тексте..
    • Предопределенные именованные символьные сущности похожи на внутренние сущности: 5 из них, однако обрабатываются особым образом во всех синтаксических анализах SGML, HTML и XML. Эти сущности отличаются от обычных анализируемых сущностей, потому что в документе встречается именованная символьная ссылка на сущность, ссылка также автоматически заменяется символьным содержимым, определенным в сущности, но разбор продолжается после текст, который заменяется заново в текущий анализируемый токен ( если такой символ разрешен в текстовом значении этого токена). Это позволяет некоторым символам, потребовать для основного синтаксиса HTML или XML, экранировать их особую синтаксическую роль (в частности, "", который заервирован для ссылок на начальные объекты, "<" or ">", ограничивает теги разметки, и "двойные" или " одинарные "кавычки, которые ограничивают значения атрибутов и определений сущностей). Предусмотренные символьные сущности также включают числовые ссылки на символы, которые обрабатываются таким же образом и другие символы для экранирования, которые они включают или для ограничений в репертуаре символов, поддерживаемых кодировкой документа.
    • В базовых профилях для SGML или в документах HTML объявление внутренних сущностей (поскольку внешние подмножества DTD не извлекаются, а внутренние подмножества DTD не поддерживаются в этих базовых профилях).
    • Вместо этих стандартов HTML, определяющих большой набор нескольких сотен именованных символьных функций, которые по-прежнему могут обрабатываться как стандартные анализируемые сущности, исполненные в DTD, используемом анализатором.
  • Внешние сущности к объекту внешнего хранилища. Они просто представляют собой уникальное имя в документе и определяют с помощью общедоступного цифрового информационного средства (FPI) и / или системного цифрового средства (интерпретируемого как URI ), указывающего их, где находится источник содержимого. Фактически существуют в двух вариантах:
    • проанализированные внешние объекты (чаще всего определяемым параметром SYSTEM, указанным URI их содержимым), которые не связаны в определении с именованной анцией, и в случае проверки XML или Парсеры SGML извлекают свое содержимое и анализируют его, как если бы они были объявлены внутренние объекты (объект, предоставлен их внешний замещающий текст);
    • неанализируемые внешние объекты, которые обрабатываются как непрозрачные ссылки и сообщенные таковые приложения, приложенные с помощью синтаксического анализа SGML или XML: их интерпретация, извлечение и синтаксический анализ приложения приложению в соответствии с типами поддерживаемых им аннотаций (см. Следующий раздел) об аннотациях и примерах неанализируемые внешние объекты).
    • Внешние объекты не поддерживаются в базовых профилях для SGML или в документах HTML, но действительны в полных реализациях SGML и в XML 1.0 или 1.1 (включая XHTML и SVG, даже если они не являются строго необходимыми в этих типах документов).

Пример объявления внутренней сущности (здесь, во внутреннем подмножестве DTD документа SGML):

]>
question; подпись;

Внутренние сущности могут быть проанализированы в любом порядке, если они не анализируются в DTD или в теле документа, в их анализе: допустимо входящие на еще не определенную сущность в содержимое анализируемого объекта, но недопустимо входящее где -либо еще какую-либо ссылку на этот объект полностью определен, включая все другие внутренние объекты, которые на есть ссылки в его определенном внутреннем объекте (это также предотвращает циклические или рекурсивные определения внутренних объектов). Этот документ анализируется так, как если бы он был следующим:

]>
Почему я не могу опубликовать свои книги непосредственно в стандартном SGML? - Уильям Шекспир.

Ссылка на внутренний объект "автор" не заменяется в заменяющем тексте внутреннего объекта "подпись". Вместо этого он заменяется только тогда, когда ссылка на сущность «подпись» анализируется в содержимом элемента «sgml», но только путем проверки парсеров (непроверяющие парсеры не заменяют ссылки на сущности, встречающиеся в содержимом элемента или в значениях атрибутов, в теле документа.

Это возможно, потому что позволяет различать параметр ссылки на сущности (которые вводят символ "%" и заменяет использованное проанализированное содержимое DTD) и общие ссылки на сущности (которые вводятся Символ «%» для введения на сущности параметров в DTD теряет свою особую роль вне DTD и становятся буквальными символами. «Появляются новые символы, без каких-либо добавленных проверяющих парсера».

нотации

Нотации используют ся в SGML или XML. лизируемые внешние сущности, интерпретация применяется приложению (интерпретирует их напрямую или извлекает сам внешний объект), присваивая им простое имя, которое можно испо льзовать в теле документа. Например, нотации назад к ссылкам на данные, не относящиеся к XML, в документе XML 1.1. Например, чтобы аннотировать изображения SVG, чтобы связать их определенным средством визуализации:

Это объявляет MIME-тип другими изображениями с этим типом и связывает его обозначение «type-image-svg». Нотаций обычно следуют соглашению об именах, которое характерно для приложения, генерирующего или используемого приложения: нотации интерпретируются как дополнительные метаданные, фактическое содержание используемых используетсяым или ОБЩЕСТВЕННЫМ ИФП, зарегистрированным в каталогах, используемым XML или анализаторами SGML или SYSTEM URI, интерпретация которые указываются в приложении (здесь тип MIME, интерпретируемый как относительный URI, но это может быть абсолютный URI для определенных средств визуализации, или URN, указывающий идентификатор объекта, зависящий от ОС, например UUID).

Объявленное имя нотации должно быть уникальным во всем объявлении типа документа, то есть во внешнем подмножестве, а также во внутреннем подмножестве, по крайней мере, для соответствия XML.

Нотации могут быть связаны с неанализируемыми внешними объектами, включенными в тело документа SGML или XML. Параметр PUBLICили SYSTEMэти внешние объекты указывают FPI и / или URI, где защищены неанализируемые данные внешнего объекта, а также дополнительные NDATAПараметр этих определенных сущностей определяет дополнительную нотацию (т. е. фактически тип MIME здесь). Например:

]>

В теле документа SGML эти внешние объекты, которые есть ссылка (имя указано между "" и ";"), не заменяются, как обычные именованные (с помощью значений CDATA), остаются как отдельные неанализируемые токены, которые могут быть быть связаны либо в атрибута элемента (как указано выше), либо внутри содержимого, при условии, что либо DTD разрешает такие внешние сущности в объявленном типе содержимого элементов или в объявленном типе атрибутов (здесь тип ENTITYдля атрибута данные) или синтаксический анализатор SGML не проверяет содержимое.

Обозначения также могут быть связаны с элементами в дополнительных метаданных, без связывания их с другими объектами, посредством предоставления имен в качестве агентов некоторых атрибутов (также объявленных в DTD в объявление элемента). Например:

]>
example1SVG;

В приведенном выше примере использования с именем "type-image-svg", который указан на стандартном общедоступном FPI и системном идентификаторе (стандартный URI) документа SVG 1.1, вместо указателя только системного указателя, как в первом примере (относительный URI, интерпретируемый) локально как тип MIME). На эту аннотацию имеется прямая ссылка в неанализируемом атрибуте «type» элемента «img», но ее содержимое не извлекается. Он также объявляет другую нотацию для приложений, зависящего от поставщика, для аннотации корневого элемента «sgml» в документе. В обоих случаях объявленная нотация используется непосредственно в объявленной атрибуте «тип», содержание которого указано в DTD с типом атрибута «NOTATION» (атрибут «тип» также объявлен для элемента «sgml» что касается элемента «img»).

Однако атрибут «title» элемента «img» указывает внутреннюю сущность «example1SVGTitle», объявление которой не определяет аннотацию, поэтому она анализируется проверяющими парсерами, а текст замены сущности - «Title из example1.svg».

Содержимое элемента "img" относится к другому внешнему объекту "example1SVG", объявление которого также не определяет нотацию, поэтому оно также анализируется проверяющими синтаксическими анализаторами, а текст замены объекта находится по его определатору СИСТЕМА example1.svg (также интерпретируется как относительный Разница с изображением GIF является в том, что изображение SVG анализируется в документе SGML в соответствии с декларациями в DTD, где изображение GIF включается как непрозрачный внешний объект (который не анализируется с помощью SGML) через его «данные» (чей тип значения - непрозрачный ENTITY).

В значении атрибутов ENTITY может быть указано только одно имя нотации (в SGML, XML 1.0 или XML 1.1 нет поддержки нескольких имен в одном объявленном внешнем ENTITY, поэтому необходимы отдельные атрибуты). ссылаться (в списке имен, разделенных пробелами) в атрибутах, объявленных типом ЛИЦ, и где каждый именованный внешний та кже объявлен своей собственной нотацией).

Нотации также непрозрачны для синтаксических анализаторов XML и SGML, они не различаются по типу внешнего объекта, на котором они могут ссылаться (для этих синтаксических анализаторов они просто имеют уникальное имя, связанное с общедоступным цифровым средством (FPI) и / или системный идентификатор (URI)).

Некоторые приложения (но не сами по себе XML или SGML) позволяют анализироваться на нотации их ссылочно, называя в значении "URN: '' name ''"стандартного атрибута CDATA, везде может быть указан URI. Это поведение зависит от приложения и требует, чтобы приложение поддерживало каталог известных URN, чтобы преобразовать их в нотации, которые были проанализированы в стандартном синтаксическом анализе SGML или XML. Такое использование позволяет определять нотации только в DTD, хранящемся как внешний объект и на который ссылается только как на внешнее подмножество, и позволяет этим документам оставаться совместимыми с проверяющими синтаксическими анализаторами документов XML или SGML, которые не имеют прямой поддержки нотаций.

Обозначения не используются в HTML или в базовых профилях для XHTML и SVG, потому что:

  • На все внешние объекты, используемые этими стандартными типами документов, названы простые атрибуты, объявленные с типом CDATA в их стандарте DTD ( например, атрибут "href" элемента привязки "или атрибут" src "элемента изображения" img, значения которого интерпретируются как URI, без необходимости-либо каталога общедоступных указателей, т. Е. Известных FPI)
  • На все внешние объекты для дополнительных метаданных указаны либо:
    • Дополнительные атрибуты (например, тип, который указывает тип MIME внешнего объекта, либо атрибут charset, который указывает его кодировку)
    • Дополнительные элементы (например, ссылка или мета в HTML и XHTML) внутри своих атрибутов
    • Стандартные псевдоатрибуты в XML и XHTML (например, xml: lang или xmlns и xmlns: * для объявлений пространств имен).

Даже при проверке парсеров SGML, XML 1.0 или XML 1.1 внешние объекты указаны на введенные FPI и / или URI в объявленных нотациях не извлекаются автоматически самими анализаторами. Вместо этого эти синтаксические анализаторы приложить проанализированные проанализированные FPI и / или URI, связанные с нотациями, найденными в документе SGML или XML, и с помощью для словаря, содержащего все имена нотаций, объявленные в DTD; эти проверяющие синтаксические анализаторы также проверяют уникальность объявлений имен нотаций и сообщают об ошибках валидации, если некоторые имена нотаций используются где-либо в DTD или в теле документа, но не объявлены:

  • Если приложение не может использовать какую-либо нотацию (или если Их FPI и / или URI неизвестны или не поддерживаются в их локальном каталоге), эти нотации могут либо игнорироваться приложение без уведомления, либо приложение может сигнализировать об ошибке.
  • В случае неудачи приложения сами решают, как интерпретировать их, а затем объекты должны быть извлечены, а проанализированы отдельно.
  • Приложения могут затем сигнализировать об ошибке, если такая интерпретация, извлечение или отдельный анализ не удается.
  • Нераспознаваемые обозначения, которые могут вызвать приложение, сигнализирует об ошибке, не должно блокировать интерпретацию документа с помощью их.
XML DTD и проверка схемы

Синтаксис XML DTD является одним из нескольких языков XML-схемы. Однако многие языки не полностью заменяют XML DTD. Примечательно, что XML DTD позволяет схематично определять простые сущности и нотации, не имеют прямых эквивалентов в XML без DTD (поскольку внутренние сущности и анализируемые внешние сущности не являются отдельными языками XML и потому, что другие неанализируемые внешние сущности и нотации не имеют соответствующих соответствующих языков схематический XML).

Большинство схем языков являются только заменой объявлений элементов и списков атрибутов таким образом, что становится возможным анализировать документы XML с помощью непроверяющих анализаторов XML (если единственной целью внешнего подмножества DTD было для определения схемы). Кроме того, документы для этих языков должны анализироваться XML отдельно, поэтому проверка схемы документов XML в чистом автономном режиме этого режима невозможна: объявление типа документа остается, по крайней мере, для идентификации (с Каталог XML ) схема, используемая в проанализированном XML-документе и проверенная на другом языке.

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

Непроверяющий синтаксический анализатор может, однако, решить не читать анализируемые внешние объекты (включая внешнее подмножество) и не должны ограничения модели контента, исполнителей в объявлениях элементов и объявлений списков атрибутов.

Если XML-документ зависит от анализируемых внешних объектов (включая указанное внешнее подмножество или анализируемые внешние объекты, объявленные во внутреннем подмножестве), он должен утвердить standalone = "no"в своем. Подтверждающее DTD может быть идентифицировано с помощью XML-каталогов для извлечения его внешнего подмножества.

В приведенном ниже примере XML-документ объявлен с помощью standalone = "no", потому что он имеет внешнее подмножество в объявлении типа документа:

Если объявление типа XML-документа включает любой СИСТЕМНЫЙ идентификатор для внешнего подмножества, он не может быть безопасно обработан как автономный: должен быть извлечен URI, в противном случае могут быть неизвестные именованные символьные сущности, определение которых может быть определено для правильного анализа эффективного синтаксиса XML во внутреннем подмножестве или в теле документа (синтаксический анализ XML обычно выполняется после замены всех именованных сущностей, за исключением пяти сущностей, которые предопределены в XML и которые неявно заменяются после анализа XML-документа на лексические токены). Если он просто включает какой-либо PUBLIC-идентификатор, он может обрабатывать этот PUBLIC-идентификатор в своем локальном каталоге, если он может получить связанный объект DTD.

Пример XML DTD

Пример очень простой схемы внешнего XML DTD для описания схемы списка лиц может состоять из:

Построчно:

  1. people_list- допустимое имя элемента, и экземпляр такого элемента содержит любое количество элементов человек. *означает, что в элементе people_listможет быть 0 или более элементов person.
  2. person- допустимое имя элемента, экземпляр такого элемента содержит один элемент с именем имя, за которым следует элемент с именем дата рождения(необязательно), пол(также необязательно) и число социальной безопасности(также необязательно). ?указывает, что элемент является необязательным. Ссылка на элемент имяимя не имеет имени ?, поэтому элемент человекдолжен содержать элемент имя.
  3. name- допустимое имя элемента, и экземпляр такого элемента «содержит проанализированные символьные данные» (#PCDATA).
  4. Дата рождения- допустимое имя элемента, и экземпляр такого элемента содержит проанализированные символьные данные..
  5. пол- допустимое имя элемента, и экземпляр такого элемента содержит проанализированные символьные данные.
  6. число социальной безопасности- допустимое имя элемента, и экземпляр такого элемента содержит проанализированные символьные данные.

Ниже приводится пример XML-файла, который использует это DTD и соответствует ему. Здесь DTD упоминается как внешнее подмножество через спецификатор SYSTEM и URI. Предполагается, что мы можем идентифицировать DTD с помощью относительной ссылки URI "example.dtd"; "people_list" после "! DOCTYPE" сообщает нам, что корневые теги или первый элемент, определенный в DTD, называется "people_list":

Fred Bloggs2008-11-27Мужской

Это можно отобразить в браузере с поддержкой XML (например, Internet Explorer или Mozilla Firefox ), вставив и сохранив DTD компонент выше в текстовый файл с именем example.dtd и файл XML в текстовый файл с другим именем и открыв XML-файл в браузере. Оба файла должны быть сохранены в одном каталоге. Однако многие браузеры не проверяют, соответствует ли XML-документ правилам в DTD; они необходимы только для проверки синтаксической правильности DTD. По соображениям безопасности они также могут не читать внешнее DTD.

То же самое DTD можно также встроить непосредственно в сам XML-документ в качестве внутреннего подмножества, заключив его в [квадратные скобки] в объявлении типа документа, и в этом случае документ больше не зависит от внешних объектов и может обрабатываться в автономном режиме:

]>Fred Bloggs27.11.2008Мужской

Альтернативы к DTD (для инструкций) доступны:

  • Схема XML, также называемой определением схемы XML (XSD), получила статус Рекомендации в W3C и популярна для "ориентированных данных" (т. е. транзакций, не связанных с публикацией) XML из-за его строгой типизации и более простого обращения к объявлениям Java. Большая часть издательского мира раскрыла, что дополнительная сложность XSD не принесла им особых преимуществ, поэтому DTD все еще более популярны там. Определение схемы XML само по себе является XML-документом, а DTD - нет.
  • RELAX NG, который также является частью DSDL, является международным стандартом ISO. Он более выразителен, чем XSD, но обеспечивает более простой синтаксис, но поддержка коммерческого программного обеспечения идет медленно.
Безопасность

XML DTD может отключить отказ в обслуживании (DoS) посредством определения вложенных сущностей, расширяющих экспоненциально, или путем отправки синтаксического анализатора XML на внешний ресурс, который никогда не возвращается.

По этой причине.NET Framework предоставляет свойство, которое позволяет запрещать или пропускать синтаксический анализ DTD, последние версии приложений Microsoft Office (Microsoft Office 2010 и выше) отказываются открывать файлы XML, содержащие объявление DTD.

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-17 10:55:00
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте