Определение типа документа ( DTD ) - это набор объявлений разметки, которые определяют тип документа для языка разметки семейства SGML ( GML , SGML , XML , HTML ).
DTD определяет допустимые строительные блоки XML-документа. Он определяет структуру документа со списком проверенных элементов и атрибутов. DTD может быть объявлен встроенным внутри XML-документа или как внешняя ссылка. [1]
XML использует подмножество SGML DTD.
По состоянию на 2009 [Обновить], новый XML - пространства имен -aware языки схем (например, W3C XML Schema и ISO RELAX NG ) были вытеснены ОТД. Версия DTD с учетом пространства имен разрабатывается как часть 9 ISO DSDL . DTD сохраняются в приложениях, которым требуются специальные символы публикации, такие как ссылки на символы XML и HTML , которые происходят из более крупных наборов, определенных в рамках разработки стандарта ISO SGML .
DTD связывается с документом XML или SGML посредством объявления типа документа (DOCTYPE). DOCTYPE появляется в синтаксическом фрагменте doctypedecl рядом с началом XML-документа. [2] Объявление устанавливает, что документ является экземпляром типа, определенного указанным DTD.
DOCTYPE декларируют два типа:
Объявления во внутреннем подмножестве образуют часть DOCTYPE в самом документе. Объявления во внешнем подмножестве находятся в отдельном текстовом файле. На внешнее подмножество можно ссылаться через общедоступный идентификатор и / или системный идентификатор . Программы для чтения документов могут не потребоваться для чтения внешнего подмножества.
Любой действительный документ SGML или XML, который ссылается на внешнее подмножество в своем DTD или тело которого содержит ссылки на проанализированные внешние объекты, объявленные в его DTD (включая те, которые объявлены в его внутреннем подмножестве ), может быть проанализирован только частично, но не может быть полностью проверен путем проверки Парсеры SGML или XML в их автономном режиме (это означает, что эти проверяющие парсеры не пытаются получить эти внешние объекты, и их текст замены недоступен).
Однако такие документы по-прежнему полностью поддаются синтаксическому анализу в нестандартном режиме проверки парсеров, который сигнализирует об ошибке, если он не может найти эти внешние объекты с их указанным общедоступным идентификатором (FPI) или системным идентификатором (URI) или недоступен. . (Обозначения, объявленные в DTD, также ссылаются на внешние сущности, но эти неанализируемые сущности не нужны для проверки документов в автономном режиме этих синтаксических анализаторов: проверка всех внешних сущностей, на которые ссылаются нотации, предоставляется приложению, использующему SGML или XML-парсер). Непроверяющие парсеры могут в конечном итоге попытаться найти эти внешние объекты в непроверенных-стандартный режим (путем частичной интерпретации DTD только для разрешения их объявленных анализируемых сущностей), но не проверять модель содержимого этих документов.
Следующий пример DOCTYPE содержит как общедоступные, так и системные идентификаторы:
<! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
Все документы HTML 4.01 соответствуют одному из трех DTD SGML. Публичные идентификаторы этих DTD являются постоянными и следующие:
Системные идентификаторы этих DTD, если они присутствуют в DOCTYPE, являются ссылками на URI . Системный идентификатор обычно указывает на определенный набор объявлений в разрешимом месте. SGML позволяет отображать общедоступные идентификаторы в системные идентификаторы в каталогах , которые необязательно доступны для преобразователей URI, используемых программным обеспечением для анализа документов .
Этот DOCTYPE может появляться только после необязательного объявления XML и перед телом документа, если синтаксис документа соответствует XML. Сюда входят документы XHTML :
<? xml version = "1.0" encoding = "utf-8"?> <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/ xhtml1 / DTD / xhtml1-transitional.dtd "> <! - здесь начинается тело документа XHTML -> <html xmlns = " http://www.w3.org/1999/xhtml " > ...</html>
Дополнительное внутреннее подмножество также может быть предоставлено после внешнего подмножества:
<? xml version = "1.0" encoding = "utf-8"?> <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/ xhtml1 / DTD / xhtml1-transitional.dtd "[ <! - сюда можно встроить внутреннее подмножество ->]><! - здесь начинается тело документа XHTML -> <html xmlns = "http://www.w3.org/1999/xhtml" > ...</html>
В качестве альтернативы может быть предоставлено только внутреннее подмножество:
<? xml version = "1.0" encoding = "utf-8"?> <! DOCTYPE html [ <! - сюда можно встроить внутреннее подмножество ->]><! - здесь начинается тело документа XHTML -> <html xmlns = "http://www.w3.org/1999/xhtml" > ...</html>
Наконец, определение типа документа может вообще не включать подмножество; в этом случае он просто указывает, что документ имеет один элемент верхнего уровня (это неявное требование для всех допустимых документов XML и HTML, но не для фрагментов документа или всех документов SGML, чьи элементы верхнего уровня могут отличаться от подразумеваемого корневого элемента), и он указывает имя типа корневого элемента:
<? xml version = "1.0" encoding = "utf-8"?> <! DOCTYPE html> <! - здесь начинается тело документа XHTML -> <html xmlns = "http://www.w3.org/ 1999 / xhtml " > ...</html>
DTD описывают структуру класса документов через объявления списков элементов и атрибутов. Объявления элементов называют допустимый набор элементов в документе и определяют, могут ли и как объявленные элементы и серии символьных данных содержаться в каждом элементе. Объявления списка атрибутов называют допустимый набор атрибутов для каждого объявленного элемента, включая тип каждого значения атрибута, если это не явный набор допустимых значений.
Объявления разметки DTD объявляют, какие типы элементов , списки атрибутов , сущности и нотации разрешены в структуре соответствующего класса XML-документов. [3]
Объявление типа элемента определяет элемент и его возможное содержимое. Допустимый XML-документ содержит только элементы, определенные в DTD.
Различные ключевые слова и символы определяют содержимое элемента:
EMPTY
для указания того, что определенный элемент не допускает никакого содержимого, т. е. не может иметь никаких дочерних элементов, даже текстовых элементов (если есть пробелы, они игнорируются);ANY
для указания того, что определенный элемент допускает любое содержимое без ограничений, т. е. что он может иметь любое количество (включая отсутствие) и тип дочерних элементов (включая текстовые элементы);( #PCDATA )
: исторически означает проанализированные символьные данные , это означает, что в содержимом разрешен только один текстовый элемент (квантификатор не допускается);( #PCDATA | ''element name'' | ... )*
: ограниченный выбор (в исключительном списке между круглыми скобками и разделенных |
вертикальной чертой и завершенных требуемым " *
" квантификатором) из двух или более дочерних элементов (включая только текстовые элементы или указанные именованные элементы) может использоваться в любом порядке и количество появлений в контенте.,
» запятая характер) одного или более содержания частиц : все частицы содержимого должны появляться последовательно в качестве непосредственных детей в содержании определенного элемента, в заданном положении и относительный порядок;|
» характер трубы) из двух или более содержания частиц : только один из этих содержания частиц могут появиться в содержании определенного элемента в том же положении.+
для указания того, что должно быть одно или несколько вхождений элемента - эффективное содержание каждого вхождения может быть разным;*
для указания того, что разрешено любое количество (ноль или более) вхождений - элемент является необязательным, и эффективное содержание каждого вхождения может быть разным;?
для указания, что должно быть не более одного вхождения - элемент не является обязательным;Например:
<! ELEMENT html ( head , body ) > <! ELEMENT p ( #PCDATA | p | ul | dl | table | h1 | h2 | h3 ) * >
Декларации типа элемента игнорируется непроверяющим SGML и XML - парсеры (в каких случаях, какие элементы принимаются в любом порядке и в любом количестве вхождений в анализируемом документе), но эти заявления по - прежнему проверяются на форму и срок действия.
Список атрибутов определяет для данного типа элемента список всех возможных атрибутов, связанных с этим типом. Для каждого возможного атрибута он содержит:
Например:
<! ATTLIST img src CDATA # ТРЕБУЕМЫЙ идентификатор ID # ПРЕДПОЛАГАЕМЫЙ sort CDATA # ФИКСИРОВАННОЕ "true" print ( yes | no ) "yes" >
Вот некоторые типы атрибутов, поддерживаемые как SGML, так и XML:
CDATA
ID
xml:id
" с этим типом, не требуя какого-либо объявления в DTD, поэтому ограничение уникальности также применяется к этим определенным идентификаторам, когда они указаны где-нибудь в документе XML.IDREF
или IDREFS
ID
в DTD (или определенным уникальным элементом в XML-документе с псевдоатрибутом " xml:id
") и действующим значением которого является тот же идентификатор;NMTOKEN
или NMTOKENS
ENTITY
или ENTITIES
(''value1''|...)
|
вертикальной чертой) текстовых значений, где каждое значение в перечислении может быть указано в '
одинарных '
или "
двойных "
кавычках, если это не простой жетон имени;NOTATION (''notation1''|...)
|
вертикальной чертой) имен нотаций, где каждое имя нотации в перечислении также должно быть объявлено в объявлении типа документа; этот тип не поддерживается в анализаторах HTML, но допустим в SGML и XML 1.0 или 1.1 (включая XHTML и SVG).Значение по умолчанию может определять, должен ли атрибут встречаться ( #REQUIRED
) или нет ( #IMPLIED
), иметь ли он фиксированное значение ( #FIXED
) или какое значение следует использовать в качестве значения по умолчанию («…») в случае, если данный атрибут не указан. в теге XML.
Декларации списка атрибутов игнорируются непроверяющий SGML и XML парсеры (в каких случаях какой - либо атрибут , принятый в пределах всех элементов разобранного документа), но эти заявления по - прежнему проверяется на корректности оформленности и действительность.
Сущность похожа на макрос . Объявление объекта присваивает ему значение, которое сохраняется во всем документе. Обычно используется более узнаваемое имя, чем числовая ссылка на незнакомый символ. [5] Сущности помогают улучшить читаемость текста XML. В общем, бывают двух типов: внутренние и внешние.
Пример объявления внутренней сущности (здесь, во внутреннем подмножестве DTD документа SGML):
<! DOCTYPE sgml [ <! ELEMENT sgml ANY > <! ENTITY % std "standard SGML" > <! ENTITY % signature "& # x2014; & author ;." > <! ENTITY % вопрос "Почему я не могу опубликовать свои книги непосредственно в% std ;?" > <! ENTITY % автор "Уильям Шекспир" > ]>
<sgml> & question; & подпись; </sgml>
Внутренние сущности могут быть определены в любом порядке, если на них нет ссылок и они не анализируются в DTD или в теле документа, в порядке их анализа: допустимо включать ссылку на еще не определенную сущность в контент. анализируемого объекта, но недопустимо включать где-либо еще какую-либо ссылку на именованный объект до того, как этот объект будет полностью определен, включая все другие внутренние объекты, на которые есть ссылки в его определенном содержимом (это также предотвращает циклические или рекурсивные определения внутренних объектов). Этот документ анализируется так, как если бы он был:
<! DOCTYPE sgml [ <! ELEMENT sgml ANY > <! ENTITY % std "стандартный SGML" > <! ENTITY % подпись "- & author ;." > <! ENTITY % вопрос «Почему я не могу опубликовать свои книги непосредственно в стандартном SGML?» > <! ENTITY % автор "Уильям Шекспир" > ]>
<sgml> Почему я не могу опубликовать свои книги непосредственно в стандартном SGML? - Вильям Шекспир. </sgml>
Ссылка на внутренний объект "автор" не подставляется в замещающий текст внутреннего объекта "подпись". Вместо этого он заменяется только тогда, когда ссылка на сущность «подпись» анализируется в содержимом элемента «sgml», но только путем проверки парсеров (непроверяющие парсеры не заменяют ссылки на сущности, встречающиеся в содержимом элемента или в значениях атрибутов, в теле документа.
Это возможно, потому что замещающий текст, указанный в определениях внутренних сущностей, позволяет различать ссылки на сущности параметров (которые вводятся символом "%" и чья замена применяется к проанализированному содержимому DTD) и общие ссылки на сущности (которые вводятся символ "&", замена которого откладывается до тех пор, пока они не будут эффективно проанализированы и проверены). Символ «%» для введения ссылок на сущности параметра в DTD теряет свою особую роль вне DTD и становится буквальным символом.
Однако ссылки на предопределенные символьные сущности заменяются везде, где они встречаются, без необходимости в проверяющем синтаксическом анализаторе (они вводятся только символом «&»).
Обозначения используются в SGML или XML. Они предоставляют полную ссылку на неанализируемые внешние объекты, интерпретация которых предоставляется приложению (которое интерпретирует их напрямую или извлекает сам внешний объект), присваивая им простое имя, которое можно использовать в теле документа. Например, нотации могут использоваться для ссылки на данные, не относящиеся к XML, в документе XML 1.1. Например, чтобы аннотировать изображения SVG, чтобы связать их с определенным средством визуализации:
<! ОБОЗНАЧЕНИЕ type-image-svg СИСТЕМА "image / svg" >
Это объявляет MIME-тип внешних изображений с этим типом и связывает его с именем записи «type-image-svg». Однако имена нотаций обычно следуют соглашению об именах, которое характерно для приложения, генерирующего или использующего нотацию: нотации интерпретируются как дополнительные метаданные, эффективное содержание которых является внешней сущностью и либо ОБЩЕСТВЕННЫМ FPI, зарегистрированным в каталогах, используемых XML или Анализаторы SGML или SYSTEM URI, интерпретация которых зависит от приложения (здесь MIME-тип, интерпретируемый как относительный URI, но это может быть абсолютный URI для определенного средства визуализации, или URN, указывающий идентификатор объекта, зависящий от ОС, например UUID).
Объявленное имя нотации должно быть уникальным во всем объявлении типа документа, то есть во внешнем подмножестве, а также во внутреннем подмножестве, по крайней мере, для соответствия XML. [6] [7]
Обозначения могут быть связаны с неанализируемыми внешними объектами, включенными в тело документа SGML или XML. Параметр PUBLIC
или SYSTEM
этих внешних объектов указывает FPI и / или URI, где расположены неанализируемые данные внешнего объекта, а дополнительный NDATA
параметр этих определенных объектов определяет дополнительную нотацию (то есть фактически тип MIME здесь). Например:
<! DOCTYPE sgml [ <! ELEMENT sgml ( img ) * > <! ELEMENT img EMPTY > <! ATTLIST img data ENTITY # ПРЕДПОЛАГАЕТСЯ > <! ENTITY example1SVG SYSTEM "example1.svg" NDATA example1SVG-rdf > <! NOTATION example1SVG-rdf SYSTEM "example1.svg.rdf" > ]>
<sgml> <img data = "example1SVG" /> </sgml>
В теле документа SGML эти внешние объекты, на которые имеются ссылки (имя которых указано между "&" и ";"), не заменяются, как обычные именованные объекты (определенные с помощью значения CDATA), а остаются в виде отдельных неанализируемых токенов, которые могут использоваться либо в качестве значения атрибута элемента (как указано выше), либо в содержимом элемента, при условии, что либо DTD разрешает такие внешние сущности в объявленном типе содержимого элементов или в объявленном типе атрибутов (здесь ENTITY
тип data
атрибута ), или синтаксический анализатор SGML не проверяет содержимое.
Нотации также могут быть напрямую связаны с элементами в качестве дополнительных метаданных, без связывания их с другим внешним объектом, путем указания их имен в качестве возможных значений некоторых дополнительных атрибутов (также объявленных в DTD в объявлении элемента). Например:<!ATTLIST ...>
<! DOCTYPE sgml [ <! ELEMENT sgml ( img ) * > <! - необязательное значение атрибута "type" может быть установлено только в эту нотацию. -> <! ATTLIST sgml type NOTATION ( зависит от типа вендора ) # ПРЕДПОЛАГАЕТСЯ > <! ELEMENT img ANY > <! - необязательное содержимое может быть только анализируемыми данными SGML или XML -> <! - Необязательное значение атрибута «title» должно быть синтаксически анализируемым как текст. Необязательное значение атрибута «данные» устанавливается на неанализируемую внешнюю сущность. Необязательное значение атрибута «type» может быть только одним из двух обозначений. -> <! ATTLIST IMG названия CDATA #IMPLIED данные ОБЪЕКТ #IMPLIED типа ОБОЗНАЧЕНИЕ ( тип изображений SVG | тип изображения GIF ) #IMPLIED > <! - Обозначения ссылаются на внешние сущности и могут быть установлены в атрибутах "type" выше, или на них должны ссылаться любые определенные внешние сущности, которые не могут быть проанализированы. -> <! NOTATION type-image-svg PUBLIC "- // W3C // DTD SVG 1.1 // EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > <! NOTATION type-image-gif PUBLIC "image / gif" > <! NOTATION, зависящее от поставщика PUBLIC "application / VND.specific + sgml" > <! ENTITY example1SVGTitle "Заголовок example1.svg" > <! - проанализированный внутренний объект -> <! ENTITY example1SVG SYSTEM "example1.svg" > <! - проанализированный внешний объект -> <! ENTITY example1GIFTitle "Заголовок example1.gif " > <! - проанализированный внутренний объект -> <! ENTITY example1GIF SYSTEM " example1.gif " NDATA type-image-gif > <! - не проанализированный внешний объект -> ]>
<sgml type = "type-vendor-specific" > <! - изображение SVG можно анализировать как допустимый текст SGML или XML -> <img title = "& example1SVGTitle;" type = "type-image-svg" > & example1SVG; </img> <! - на него также можно ссылаться как на неанализируемую внешнюю сущность -> <img title = "& example1SVGTitle;" data = "example1SVG" /> <! - изображение GIF не поддается синтаксическому анализу, и на него можно ссылаться только как на внешнюю сущность -> <img title = "& example1GIFTitle;" data = "example1GIF" /> </sgml>
В приведенном выше примере показана нотация с именем "type-image-svg", которая ссылается на стандартный общедоступный FPI и системный идентификатор (стандартный URI) документа SVG 1.1, вместо того, чтобы указывать только системный идентификатор, как в первом примере (который был относительный URI, интерпретируемый локально как тип MIME). На эту аннотацию имеется прямая ссылка в неанализируемом атрибуте «type» элемента «img», но ее содержимое не извлекается. Он также объявляет другую нотацию для приложения, зависящего от поставщика, для аннотации корневого элемента «sgml» в документе. В обоих случаях объявленная нотация named используется непосредственно в объявленном атрибуте «type», содержимое которого указано в DTD с типом атрибута «NOTATION» (этот атрибут «type» объявлен для элемента «sgml»,а также для элемента "img").
Однако атрибут «title» элемента «img» указывает внутреннюю сущность «example1SVGTitle», объявление которой не определяет аннотацию, поэтому она анализируется проверяющими синтаксическими анализаторами, а текст замены сущности - «Title of example1.svg».
Содержимое элемента «img» ссылается на другой внешний объект «example1SVG», объявление которого также не определяет нотацию, поэтому оно также анализируется проверяющими синтаксическими анализаторами, а текст замены объекта находится по его определенному идентификатору SYSTEM «example1.svg» ( также интерпретируется как относительный URI). Эффективным содержимым для элемента «img» будет содержимое этого второго внешнего ресурса. Разница с изображением GIF заключается в том, что изображение SVG анализируется в документе SGML в соответствии с декларациями в DTD, где изображение GIF просто упоминается как непрозрачный внешний объект (который не может быть проанализирован с помощью SGML) через его " data »(чей тип значения - непрозрачный ENTITY).
В значении атрибутов ENTITY может быть указано только одно имя нотации (в SGML, XML 1.0 или XML 1.1 нет поддержки для нескольких имен нотации в одном объявленном внешнем ENTITY, поэтому необходимы отдельные атрибуты). Однако на несколько внешних объектов можно ссылаться (в списке имен, разделенных пробелами) в атрибутах, объявленных с типом ENTITIES, и где каждый именованный внешний объект также объявлен со своей собственной нотацией).
Обозначения также полностью непрозрачны для синтаксических анализаторов XML и SGML, поэтому они не различаются по типу внешнего объекта, на который они могут ссылаться (для этих синтаксических анализаторов они просто имеют уникальное имя, связанное с общедоступным идентификатором (FPI) и / или системный идентификатор (URI)).
Некоторые приложения (но не сами анализаторы XML или SGML) также позволяют ссылаться на нотации косвенно, называя их в "URN:''name''"
значении стандартного атрибута CDATA, везде, где может быть указан URI. Однако это поведение зависит от приложения и требует, чтобы приложение поддерживало каталог известных URN, чтобы преобразовать их в нотации, которые были проанализированы в стандартном синтаксическом анализаторе SGML или XML. Такое использование позволяет определять нотации только в DTD, хранящемся как внешний объект и на который ссылаются только как на внешнее подмножество документов, и позволяет этим документам оставаться совместимыми с проверяющими синтаксическими анализаторами XML или SGML, которые не имеют прямой поддержки нотаций.
Обозначения не используются в HTML или в базовых профилях для XHTML и SVG, потому что:
Даже при проверке парсеров SGML, XML 1.0 или XML 1.1 внешние объекты, на которые ссылается FPI и / или URI в объявленных нотациях, не извлекаются автоматически самими анализаторами. Вместо этого эти синтаксические анализаторы просто предоставляют приложению проанализированный FPI и / или URI, связанный с нотациями, найденными в проанализированном документе SGML или XML, и с возможностью для словаря, содержащего все имена нотаций, объявленные в DTD; эти проверяющие синтаксические анализаторы также проверяют уникальность объявлений имен нотаций и сообщают об ошибке валидации, если некоторые имена нотаций используются где-то в DTD или в теле документа, но не объявлены:
Синтаксис XML DTD - один из нескольких языков схем XML . Однако многие языки схем не полностью заменяют XML DTD. Примечательно, что XML DTD позволяет определять сущности и нотации, которые не имеют прямых эквивалентов в XML без DTD (поскольку внутренние сущности и анализируемые внешние сущности не являются частью языков схем XML, и потому что другие неанализируемые внешние сущности и нотации не имеют простых эквивалентных отображений в большинство языков схем XML).
Большинство языков схем XML являются лишь заменой объявлений элементов и списков атрибутов, так что становится возможным анализировать документы XML с помощью непроверяющих анализаторов XML (если единственной целью внешнего подмножества DTD было определение схемы). Кроме того, документы для этих языков схемы XML должны анализироваться отдельно, поэтому проверка схемы документов XML в чистом автономном режиме на этих языках невозможна: объявление типа документа остается необходимым, по крайней мере, для идентификации (с помощью каталога XML ) схема, используемая в проанализированном XML-документе и проверенная на другом языке.
Распространенное заблуждение состоит в том, что непроверяющий XML-синтаксический анализатор не должен читать объявления типа документа, тогда как на самом деле объявления типа документа все равно должны сканироваться на предмет правильного синтаксиса, а также правильности объявлений, и синтаксический анализатор должен по-прежнему анализировать все сущности. объявления во внутреннем подмножестве и заменяют замещающие тексты внутренних сущностей, встречающиеся где угодно в объявлении типа документа или в теле документа.
Непроверяющий анализатор может, однако, предпочитает не читать оформленные внешние сущности ( в том числе внешнего подмножества ), и не должен соблюдать ограничение модели содержания , определенное в объявлениях элементов и в списке атрибутов объявлений.
Если XML-документ зависит от анализируемых внешних сущностей (включая указанное внешнее подмножество или анализируемые внешние сущности, объявленные во внутреннем подмножестве ), он должен утверждаться standalone="no"
в своем XML-объявлении . Подтверждающее DTD может быть идентифицировано с помощью каталогов XML для извлечения его указанного внешнего подмножества .
В приведенном ниже примере XML-документ объявлен с помощью, standalone="no"
потому что он имеет внешнее подмножество в объявлении типа документа:
<? xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <! DOCTYPE people_list SYSTEM "example.dtd"> <people_list />
Если объявление типа XML-документа включает какой-либо идентификатор SYSTEM для внешнего подмножества, его нельзя безопасно обрабатывать как автономное: должен быть извлечен URI, в противном случае могут быть неизвестные именованные символьные сущности, определение которых может потребоваться для правильного синтаксического анализа эффективного XML. синтаксис во внутреннем подмножестве или в теле документа (синтаксический анализ XML обычно выполняется после замены всех именованных сущностей, за исключением пяти сущностей, которые предопределены в XML и которые неявно заменяются после анализа XML-документа на лексические токены). Если он просто включает какой-либо ОБЩЕСТВЕННЫЙ идентификатор, он может обрабатываться как автономный, если процессор XML знает этот PUBLIC идентификатор в своем локальном каталоге, откуда он может получить связанный объект DTD.
Пример очень простого внешнего XML DTD для описания схемы списка лиц может состоять из:
<! ELEMENT people_list ( человек ) * > <! ELEMENT человек ( имя , дата рождения ?, Пол ?, SocialSecurityNumber ?) > <! ELEMENT имя ( #PCDATA ) > <! ELEMENT дата рождения ( #PCDATA ) > <! ELEMENT пол ( # PCDATA ) > <! Номер социальной защиты ELEMENT ( #PCDATA ) >
Взяв эту строку за строкой:
people_list
- допустимое имя элемента, и экземпляр такого элемента содержит любое количество person
элементов. В *
обозначает может быть 0 или более person
элементов внутри people_list
элемента.person
- допустимое имя элемента, и экземпляр такого элемента содержит один элемент с именем name
, за которым следует один с именем birthdate
(необязательно), затем gender
(также необязательно) и socialsecuritynumber
(также необязательно). Знак ?
указывает на то, что элемент является необязательным. Ссылка на name
имя элемента не имеет ?
, поэтому person
элемент должен содержать name
элемент.name
- допустимое имя элемента, и экземпляр такого элемента содержит «проанализированные символьные данные» (#PCDATA).birthdate
- допустимое имя элемента, и экземпляр такого элемента содержит проанализированные символьные данные.gender
- допустимое имя элемента, и экземпляр такого элемента содержит проанализированные символьные данные.socialsecuritynumber
- допустимое имя элемента, и экземпляр такого элемента содержит проанализированные символьные данные.Ниже приводится пример файла XML, который использует это DTD и соответствует ему. Здесь DTD упоминается как внешнее подмножество через спецификатор SYSTEM и URI. Предполагается, что мы можем идентифицировать DTD с помощью относительной ссылки URI «example.dtd»; "people_list" после "! DOCTYPE" сообщает нам, что корневые теги или первый элемент, определенный в DTD, называется "people_list":
<? xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <! DOCTYPE people_list SYSTEM "example.dtd"> <people_list> <person> <name> Fred Bloggs </name> <Дата рождения > 2008-11-27 </ дата рождения> <пол> Мужчина </ пол> </ человек> </ people_list>
Это можно отобразить в браузере с поддержкой XML (таком как Internet Explorer или Mozilla Firefox ), вставив и сохранив указанный выше компонент DTD в текстовый файл с именем example.dtd, а файл XML - в текстовый файл с другим именем и открыв файл XML-файл в браузере. Оба файла должны быть сохранены в одном каталоге. Однако многие браузеры не проверяют, соответствует ли XML-документ правилам в DTD; они нужны только для проверки синтаксической правильности DTD. По соображениям безопасности они также могут не читать внешнее DTD.
Тот же самый DTD также может быть встроен непосредственно в сам XML-документ в качестве внутреннего подмножества, заключив его в [квадратные скобки] в объявлении типа документа, и в этом случае документ больше не зависит от внешних сущностей и может обрабатываться в автономном режиме. :
<? xml version = "1.0" encoding = "UTF-8" standalone = "yes"?> <! DOCTYPE people_list [ <! ELEMENT people_list (person *)> <! ELEMENT person (имя, дата рождения?, пол?, номер социальной безопасности ?)> <! Имя элемента (#PCDATA)> <! Дата рождения элемента (#PCDATA)> <! Пол элемента (#PCDATA)> <! Номер социальной безопасности ELEMENT (#PCDATA)>]><people_list> <человек> <имя> Фред Bloggs </ имя> <дата рождения> 2008-11-27 </ дата рождения> <пол> Мужчина </ пол> </ человек> </ people_list>
Доступны альтернативы DTD (для указания схем):
XML DTD можно использовать для создания атаки типа «отказ в обслуживании» (DoS) путем определения вложенных сущностей, которые расширяются экспоненциально, или путем отправки синтаксического анализатора XML на внешний ресурс, который никогда не возвращается. [10]
По этой причине .NET Framework предоставляет свойство, которое позволяет запрещать или пропускать синтаксический анализ DTD [10], а последние версии приложений Microsoft Office (Microsoft Office 2010 и выше) отказываются открывать файлы XML, содержащие объявления DTD.
Для этой статьи нужны дополнительные или более конкретные категории . ( Июнь 2020 г. ) |