Введение в XML 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 ».
Шпаргалка по 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. Атрибут дает больше информации о элементе или более точно он определяет свойство элемента. Атрибут XML всегда в форме пары им-значения. Элемент может иметь любое число уникально атрибутов.
Объявление атрибута очень много подобно к объявлениям элемента в много путей за исключением одного; вместо объявлять позволяемое содержание для элементов, вы объявляете список позволяемых атрибутов для каждого элемента. Эти списки вызваны объявлением ATTLIST.
Синтаксис
Основной синтаксис объявления атрибутов DTD следующим образом:
В вышеуказанном синтаксисе
Старт атрибутов DTD с
элемент-имя определяет имя элемента к которому атрибут применяется.
атрибут-имя определяет имя атрибута который включен с элемент-именем.
атрибут-тип определяет тип атрибутов. Мы обсудим больше на этом в следующих разделах.
атрибут со значением принимает фикчированное значение которое атрибуты должны определить. Мы обсудим больше на этом в следующих разделах.
Пример
Ниже простой пример для объявления атрибута в DTD:
]>
Препятствуйте нам пойти через вышеуказанный Код:
Начните с объявлением XML с следующим заявлением:
Немедленно после коллектора XML тип объявление документа, обыкновенно называемое DOCTYPE:
DOCTYPE сообщает парсер что DTD связан с этим документом XML. Объявление DOCTYPE имеет восклицательный знак (!) в начале имени элемента.
Следование тело DTD. Здесь мы объявляли элемент и атрибут:
Удостоверение личности атрибута для имени элемента определено как:
Здесь тип атрибута CDATA и свое значение #REQUIRED .
Правила объявления атрибута
Все атрибуты используемые в документе XML необходимо объявить в определении типа документа (DTD) используя объявление Атрибут-Списка
Атрибуты могут только появиться в старт или пустые бирки.
Ключевое слово ATTLIST должно находиться в верхушке - случае
Никакие двойные имена атрибута не будут позволены внутри список атрибута для, котор дали элемента.
Типы атрибута
Объявляя атрибуты, вы можете определить как обработчик должен отрегулировать данные которые появляются в значение. Мы можем классифицировать атрибут печатаем внутри 3 главным образом категории на машинке:
Тип строки
Типы Tokenized
Перечисленные типы
Следовать таблица обеспечивает сводку различных типов атрибута:
Тип | Описание |
---|---|
CDATA | CDATA данные по характера (текст и не повышение цены). Тип атрибута строки . |
Удостоверение личности | Это уникально обозначение атрибута. Оно не должен появиться больше чем раз. Тип атрибута Tokenized . |
IDREF | Оно использован для того чтобы снабдить ссылками удостоверение личности другого элемента. Оно использован для того чтобы установить элементы связь между. Тип атрибута Tokenized . |
IDREFS | Оно использован для того чтобы снабдить ссылками множественное удостоверение личности. Тип атрибута Tokenized . |
РЕАЛЬНОСТЬ | Она представляет внешнюю реальность в документе. Тип атрибута Tokenized . |
РЕАЛЬНОСТИ | Оно представляет список внешних реальностей в документе. Тип атрибута Tokenized . |
NMTOKEN | Оно подобен к CDATA и атрибут со значением состоит из действительного имени XML. Тип атрибута Tokenized . |
NMTOKENS | Оно подобен к CDATA и атрибут со значением состоит список действительного имени XML. Тип атрибута Tokenized . |
НОТАЦИЯ | Элемент будет снабжен ссылками к объявленной нотации в документе DTD. Перечисленный тип атрибута . |
Обозначение | Оно позволяет определить специфический список значений где одно из значений должно соответствовать. Перечисленный тип атрибута . |
Объявление атрибута со значением
В пределах каждого объявления атрибута, вы должны определить как значение появится в документ. Вы можете определить если атрибут:, то
подразумевает
смогите иметь автоматически принимаемое значение
смогите иметь фикчированное значение
Автоматически принимаемые значения
Он содержит автоматически принимаемое значение. Значения могут быть заключили в одиночные кавычки (") или двойные цитаты (")
СинтаксисСледование синтаксис значения:
где значени по умолчанию-значение определенный атрибут со значением.
ПримерСледование простой пример объявления атрибута с автоматически принимаемым значением:
]>
В этом примере мы имеем элемент имени с удостоверением личности атрибута которого автоматически принимаемое значение 0 . Автоматически принимаемое значение заключено в пределах двойных цитат.
ФИКЧИРОВАННЫЕ значения
ключевое слово #FIXED следовать фикчированным значением использовано когда вы хотите определить что атрибут со значением постоянн и не может быть изменен. Общяя польза фикчированных атрибутов определяет номера версии.
СинтаксисСледование синтаксис фикчированных значений:
где #FIXED определенный атрибут со значением.
ПримерСледование простой пример объявления атрибута с ФИКЧИРОВАННЫМ значением:
]>
В этом примере мы использовали #FIXED ключевого слова где оно показывает что значение «tutorialspoint» единственное значение для имени
атрибута
Следование инвалидный DTD:
]>
НЕОБХОДИМЫЕ значения
Когда вы хотите определите что атрибут необходим, используйте ключевое слово #REQUIRED.
СинтаксисСледование синтаксис #REQUIRED:
где #REQUIRED определенный тип атрибута.
ПримерСледование простой пример объявления атрибута DTD с ключевым словом #REQUIRED:
]>
В этом примере мы использовали ключевое слово #REQUIRED для того чтобы определить что удостоверение личности атрибута необходимо предусмотреть для имени элемент- имени
ПОДРАЗУМЕВАЕМЫЕ значения
Объявляя атрибуты вы должны всегда определять объявление значения. Если атрибут вы объявляете не имеет никакое автоматически принимаемое значение, то не имеет никакое фикчированное значение, и не требует, тогда вы должны объявить что атрибут как подразумевали . #IMPLIED ключевого слова использовано для того чтобы определить атрибут как подразумевали .
СинтаксисСледование синтаксис #IMPLIED:
где #IMPLIED определенный тип атрибута.
ПримерСледование простой пример #IMPLIED
]>
В этом примере мы использовали #IMPLIED ключевого слова по мере того как мы не хотим определить любые атрибуты, котор нужно включить в имени элемента. Оно опционный.
XML для описания подобных "самодеятельных" тэгов используются схемы . Они необходимы для того, чтобы:- описать, что именно является разметкой;
- описать точно, что означает разметка.
Наиболее известными языками описания схем являются следующие:
- 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 схему, описывающую структуру электронного почтового ящика: