Описание структуры XML документа средствами DTD – Document Type Definition. Основы использования XML-схем для определения элементов
Шпаргалка по DTD .
DTD – Один из способов формализованного описания схемы документа XML , сделанного на языке, понятном программе-анализатору.
В настоящее время идет отказ от использования DTD в пользу XSD (XML Schema Definition ), по ряду причин:
- DTD использует отличный от XML синтаксис.
- Отсутствует типизация узлов.
- Отсутствует поддержка пространств имён.
Тем не менее этот способ ещё широко применяется поскольку является более простым и удобным для описания несложных схем документов.
КОНСТРУКЦИИ DTD
Описание схемы состоит из объявлений разметки (markup declaration ), начинающихся с пары символов “ ” далее идет одно из слов:
- ELEMENT (указывает, что объявляется элемент )
- ATTLIST (список атрибутов )
- ENTITY (сущность )
- NOTATION (обозначение )
объявление разметки заканчивается “> ”
ОБЪЯВЛЕНИЕ ТИПА ЭЛЕМЕНТА
(должен быть описан каждый элемент документа)
Содержимое:
- EMPTY
– пустой (например
) - ANY – любое содержимое (встречается редко)
- (#PCDATA) – только символьные данные
- (список имен вложенных элементов ч.з. запятую)
– вложенные элементы должны следовать в документе в том порядке, в котором они перечислены в объявлении. Объявляется только один уровень вложенности. Элементы можно группировать скобками.
Использование разделителя “| ” между элементами указывает, что встречается один из разделенных элементов.
После элементов или скобок:- “? ” – встречается 0 или 1 раз
- “* ” – 0 или несколько раз
- “+ ” – 1 или несколько раз
ОБЪЯВЛЕНИЕ АТРИБУТОВ
Атрибуты объявляются после объявления самого элемента. Все атрибуты одного элемента объявляются сразу, одним списком.
Для каждого атрибута записывается его имя, тип и признак обязательности.
Типы атрибутов:
- CDATA – (Character set of data ) строка символов
- Список значений атрибута в скобках, перечисл чз “|”
- ID – уникальный идентификатор
- IDREF – идентификатор, содержащий одно из значений атрибута ID , исп в качестве ссылки на др элементы
- IDREFS – идентификатор, содержащий набор значений атрибута типа ID , перечисленных через пробел, так же исп в качестве ссылки сразу на несколько элементов.
- ENTITY – имя не проверяемой анализатором сущности (объявленные в том же описании DTD )
- ENTITIES – имена не проверяемых анализатором сущностей.
- NMTOKEN – слово, содержащее только символы, применяемые в именах (имена др элементов или атрибутов, например чтобы ссылаться на них )
- NMTOKENS – слова, перечисленные через пробелы
- NOTATION – обозначение (обозначения, расшифрованные в описании DTD )
- NOTATIONS – список нотаций
признак обязательности:
- Значение атрибута по умолчанию – указывается в кавычках и обозначает что атрибут необязателен.
- # REQUIRED – атрибут надо обязательно записывать в элементе.
- # IMPLIED – атрибут необязателен, у него нет значения по умолчанию.
- # FIXED – у атрибута есть только одно значение, кот записывается тут же через пробел.
При исп пространства имен надо всегда указывать уточненное (QName ), а не локальное имя.
Атрибуты не входят в пространство имен по умолчанию.
Атрибуты “xml:lang ” и “xml:space ” так же дол быть объявлены в DTD в случае их применения
ОБЪЯВЛЕНИЕ СУЩНОСТЕЙ
(начинаются с “&”, а заканчиваются “;”)
Внутренние сущности – задаются при объявлении сущности.
— можно применять дальше в самом DTD ниже объявления.
Внешние сущности – содержатся в отдельном файле или встроены в программу-анализатор.
Параметризованные сущности – исп только внутри описания DTD
Сущности делятся на разбираемые(parsed ) и не разбираемые (unparsed ). Разбираемые предст собой фрагмент документа XML или целый документ и подлежат обработке программой-анализатором после подстановки. После подстановки разборки сущность становится частью XML документа.
Двоичный программный код, чертеж, изображение и др. не надо обрабатывать средствами XML , для этого сущность надо объявить не разбираемой. Для этого в конце объявления сущности делается пометка “NDATA ” и указывается обозначение (notation ) вставляемого объекта.
ПРЕДОПРЕДЕЛЕННЫЕ СУЩНОСТИ В XML
ОБЪЯВЛЕНИЕ ОБОЗНАЧЕНИЯ ( NOTATION)
Объявляются подобно сущностям, также могут быть внутренними и внешними.
Внутренняя
Внешняя
SYSTEM | PUBLIC — в данном случае равнозначны т.к. в public не обязательно общеизвестная ссылка.
РАЗМЕЩЕНИЕ DTD
Либо в отдельном файле “*.dtd ” указав его имя в кавычках во второй части пролога DOCTYPE , либо включить описание непосредственно во вторую часть пролога, заключив его в квадратные скобки.
]>
- описать, что именно является разметкой;
- описать точно, что означает разметка.
Наиболее известными языками описания схем являются следующие:
- DTD (Document Type Definition) - язык определения типа документов, который первоначально использовался в качестве язык описания структуры SGML-документа.
- XDR (XML Data Reduced) – диалект схемы XML, разработанный Microsoft, который поддерживался в Internet Explorer 4 и 5 версий.
- XML Schema или просто XSD (язык определения схем XML) – рекомендация консорциума W3C с 2001 года.
Рассмотрим подробнее первые два из них. Третий язык описания схем рассматривается в лабораторной работе 11.
DTD схема
Схема DTD предоставляет шаблон разметки документа, в котором указываются наличие , порядок следования и расположение элементов и их атрибутов в документе XML .
В рамках DTD модель содержимого XML документа можно описать следующим образом:
Каждый элемент документа может иметь один из типов:
Содержание | Синтаксис | Комментарий |
---|---|---|
Данные | Содержит только текстовые данные | |
Другие элементы | Содержит только дочерние элементы | |
Смешанное | Содержит комбинацию текстовых данных и дочерних элементов | |
EMPTY | Ничего не содержит | |
ANY | Может содержать текстовые данные или дочерние элементы |
Атрибуты, находящиеся внутри тэгов документа, описываются отдельно с помощью синтаксиса:
При этом атрибут в DTD может иметь один из трех типов:
- Строка
- Маркированные атрибут
- Атрибута с перечислением
Кроме типа атрибута можно также задавать и его модальность:
Рассмотрим в качестве примера описание атрибутов строкового типа для элемента, описывающего некоторое сообщение:
Если этот элемент содержит атрибуты с перечислением , то их описание может выглядеть, например, следующим образом:
Маркированных атрибуты элемента могут быть четырех типов:
И, наконец, в DTD можно использовать следующие индикаторы вхождения последовательностей:
Символ | Пример | Описание |
---|---|---|
, | (a, b, c) | Последовательное использование элементов списка |
| | (a | b | c) | Используется один из членов списка |
date | Используется один и только один элемент | |
? | subject ? | Необязательное использование (0 или 1 раз) |
+ | paragraph+ | Используется один или несколько раз |
* | brother* | Используется ноль или несколько раз |
В качестве примера приведем DTD схему, описывающую структуру электронного почтового ящика:
Определение типов документа (DTD) декларирует допустимые строительные блоки XML документа. Оно задает структуру документа со списком допустимых элементов и атрибутов.
DTD может декларироваться как в коде самого XML документа, так и во внешнем файле с подключением его к XML документу.
Внутренняя декларация DTD
Если DTD декларируется внутри XML файла, то она должны быть заключена в специальный тег декларации DOCTYPE , который имеет следующий синтаксис:
Пример XML документа с внутренним DTD:
]>
DTD в приведенном примере интерпретируется следующим образом:
- !DOCTYPE note определяет, что корневым элементом документа является note
- !ELEMENT note определяет, что элемент note содержит четыре элемента: to, from, heading, body
- !ELEMENT to определяет, что элемент to должен быть
- !ELEMENT from определяет, что элемент from должен быть типа "#PCDATA"
- !ELEMENT heading определяет, что элемент heading должен быть типа "#PCDATA"
- !ELEMENT body определяет, что элемент body должен быть типа "#PCDATA"
Внешняя декларация DTD
Если DTD декларируется во внешнем файле, то подключение осуществляется следующим образом:
Ниже приводится тот же XML документ, что и ранее, но с внешней декларацией DTD:
А вот что содержится в файле "note.dtd", который декларирует DTD:
Для чего используют DTD?
С DTD каждый ваш XML файл может нести описание своего собственного формата.
С DTD различные, не связанные друг с другом, группы людей могут приходить к соглашению о стандартах взаимно обмениваемых данных.
С DTD вы можете быть уверены, что получаемые из внешних источников данные будут корректными.
Также, вы можете использовать DTD, чтобы проводит проверки корректности своих собственных данных.
Как раз таковыми и являются. Причём XML сам по себе предусматривает расширяемость. Документы созданные с помощью этих языков могут быть «корректными (well-formed)» и «допустимыми (valid)».
С проверкой документа на корректность проблем не возникает: если ошибок не выскочило и всё отобразилось так, как мы хотели, то документ корректен. Например, если в HTML-документе написать что-то вроде «
Допустимость проверяется с помощью определения типа документа (DTD, document type definition). Например, для «строгого» HTML он выглядит так .
DTD может быть описан как внутри документа, так и вынесен в отдельный файл (аналогия с CSS: встроенные и подключаемые таблицы стилей).
Объявление DTD
Объявление DTD располагается перед первым (корневым) элементом документа, начинается с последовательности « ».
Внутреннее DTD описывается так:
Между квадратными скобками располагается содержимое DTD, так называемое внутреннее подмножество , например:
] >
Если DTD вынесено в отдельный файл (обычно имеющий расширение.dtd), то его объявление в документе записывается так:
Соответственно, в этом файле и прописываются все правила, так называемое внешнее подмножество .
Имя, указанное за словом « DOCTYPE » (в нашем случае « catalog »), должно соответствовать имени корневого элемента. То есть, XML-документ должен быть примерно таким:
Вместо ключевого слова « SYSTEM » может быть использовано слово « PUBLIC », указывающее, что DTD применяется для широкого использования:
Внутренние и внешние подмножества могут быть заданы одновременно (опять же, аналогия с CSS):
] >
Здесь, сначала зачитывается содержимое файла « catalog.dtd », а потом содержимое, указанное внутри квадратных скобок.
Элементы документа
Элементы объявляются в DTD с помощью ключевого слова « ELEMENT », после которого следует имя элемента и его содержимое заключенное в круглые скобки:
Если у элемента есть дочерние элементы, то это записывается так:
что соответствует документу:
Если у элемента несколько дочерних элементов, то они перечисляются через запятую и должны следовать строго в указанном порядке:
Приведённый выше пример читается следующим образом. Элемент « book » должен содержать только один элемент « title », за которым должен следовать только один элемент « author ». Сами элементы « title » и « author » никаких элементов не содержат, а могут содержать лишь какой-нибудь текст.
С помощью следующих специальных символов можно определять количественное присутствие элемента:
- Символ « * », следующий после элемента, означает, что элемент может присутствовать один или несколько раз, или не присутствовать вовсе(от нуля до + бесконечности)
- Символ « + », следующий после элемента, означает, что элемент может присутствовать один или несколько раз(от 1 до + бесконечности)
- Символ « ? », следующий после элемента, означает, что элемент может либо отсуствовать, либо присутствовать только один раз(0 или 1)
Если существует необходимость указать один из нескольких элементов (или title, или author — любой из них, но не оба), надо испольовать символ « | »:
Текст тоже равноправный участник игры. Ключевое слово « PCDATA » указывает на анализируемые символьные данные, поэтому любой текст содержащий символы разметки (« < », « > » и « & ») будет трактоваться как разметка. Совместное использование текста и элементов называется смешанным содержимым . При объявлении смешанного содержимого, « PCDATA » необходимо указывать первым:
Следующий фрагмент документа валиден вышеприведенному примеру:
Группы элементов заключаются в круглые скобки. Элемент « book » должен содержать либо текст, либо (один « title », один или неколько « author » и может быть один « pubyear » именно в таком порядке):
Данному примеру соответствует следующий фрагмент XML-документа:
Элемент может быть пустым. Такой элемент не может содержать не дочерних элементов ни текста (например, элемент « br » в HTML). Такой элемент задается с ключевым словом « EMPTY »:
Элемент также может быть объявлен с ключевым словом « ANY » означающее, что элемент может содержать и элементы, и текст, и все это вместе, и даже быть пустым.
Атрибуты элементов
Элементы в XML-документе могут иметь атрибуты, которые записываются в виде « имя = значение » в открывающем или пустом тегах. Общее объявление атрибутов конкретного элемента начинается с ключевого слова « ATTLIST », после которого следует имя данного элемента и объявления самих атрибутов:
Ключевое слово « REQUIRED » указывает на то, что атрибут обязателен. Ключевое слово « IMPLIED », наоборот, говорит, что атрибут необязателен.
У атрибутов могут быть перечисленны разрешенные значения:
Также может быть задано значение по-умолчанию:
pubyear CDATA #IMPLIED "2007">
Атрибут может быть и константой, то есть у него может быть только то значение, которое заявлено в объявлении атрибута. Делается это с помощью ключевого слова « FIXED »:
#FIXED "udvikler">
Тип атрибута « CDATA »позволяет использовать любые символы кроме « < », « > », « & », « " » и « " ». В случае использования, данные символы должны быть заменены на спецсимволы типа « < » и т.п. Внимание : в DTD ключевое слово « CDATA » имеет другое значение, чем раздел « CDATA » в XML-документе!
Помимо типа CDATA, атрибуты могут иметь следующие типы:
- NMTOKEN - может содержать только буквы, цифры, « . », « - », « _ » и « : »
- NMTOKENS - может содержать те же символы, что и « NMTOKEN », а также символы пробела, возврата каретки, перевода строки и табуляции
Еще один тип атрибута « ID » разрешает задавать те же значения, что и тип NMTOKEN, но начинаться значение должно либо с буквы, либо с « _ », либо с « : ». У любого элемента может быть только один атрибут с типом « ID ». Атрибут типа « ID » не может быть константой (объявляться как « FIXED »). Значение атрибута типа « ID » должно быть уникальным для всего XML-документа:
Атрибут элемента может быть ссылкой на атрибут типа « ID » другого элемента. Для этого он объявляется как атрибут типа « IDREF ». Если атрибут должен ссылаться на атрибут типа « ID » нескольких элементов, то испольуется ключевое слово « IDREFS »:
В XML-документе это будет выглядить так:
Объявление сущностей
Помимо элементов и их атрибутов, мы можем определить сущности , записываемые с помощью ключевого слова « ENTITY »:
В результате чего, на место имени сущности « name », будет подставлено ее значение, в нашем случае — « SuperMegaMaster ».
И для полноты нашего счастья, надо добавить, что атрибуты элементов могут иметь в качестве значения подобные сущности — сущности-атрибуты . Они тоже определяются с помощью ключевого слова « ENTITY », но имеют одно ограничение — они должны ссылаться на внешние неанализируемые сущности, определенные во внешнем подмножестве DTD:
] >
В вышеприведённом примере, объявлена сущность « list », которая ссылается на внешний документ « companyList.html ». Ключевое слово « NDATA », говорит о том, что внешний документ неявляется XML-документом. Далее, для элемента « user » объявляется атрибут « company », который является обязательным и имеет тип « ENTITY », то есть ссылается на какую-либо сущность. Поскольку в нашем пример задана только одна сущность (« list »), то именно она и только она может быть значением атрибута « company » в XML-документе:
Осталось только понять, что означает « parse » в строке объявления сущности « list »? Когда используются неанализируемые данные, то есть те, которые не анализируются синтаксическим анализатором XML, хорошо было бы дать информацию приложению (использующему данный XML-документ), каким образом обработать эту сущность, если все-таки потребуется. Для этого нужно использовать нотацию, задаваемую ключевым словом « NOTATION » и дополнить наш DTD следующим образом:
Слово « parse » в объявлении сущности лист указывает на то, каким образом можно проанализировать файл « companyList.html » — найти нотацию с именем « parse » и следовать ее указаниям. В нашем случае, приложение может открыть MS InternetExplorer и загрузить в него документ « companyList.html ».