Презентацию подготовила Гайнутдинова Аида, гр. 950б. Что такое схема DTD и каким образом она связывается с документами XML. Как написать внутреннюю или внешнюю схему DTD. Объявление элементов и атрибутов в DTD. Использование ссылок в схемах DTD. Различия между парсерами с проверкой правильности и без нее. Некоторые недостатки схем DTD и почему необходимо создание новых тем. DTD – это схема , разработанная еще для языка SGML. Когда впервые появился XML, он был как “SGML без DTD”. Вы можете получать хорошо оформленные документы XML, с которыми не будет связано никакой схемы, но схема DTD – это мощное средство добавления ограничений на обмен данных, позволяющее контролировать использование в документах должных структур данных, проверять правильность содержания документа на предмет соблюдения некоторых правил. Схема DTD предоставляет шаблон разметки документа, в котором указываются наличие, порядок следования и расположение элементов и их атрибутов в документе XML. Документ XML можно представить в виде древовидной структуры элементов, содержащей данные, другие элементы и атрибуты. Схему DTD тоже можно представить в виде дерева, но между этими деревьями существует ряд различий, даже если документ XML полностью соответствует схеме DTD. Дерево DTD само по себе не повторяет элементы или структуру. Но его структуры дублируют элементы в соответствующем правильном экземпляре XML. Схемы DTD имеют дело с элементами документа XML или как с элементами-контейнерами, или как с пустыми элементами (т.е. подстановочными элементами в структуре документа). Элементыконтейнеры могут содержать данные (например, текст), дочерние элементы или и то и другое. Схема DTD предоставляет синтаксические правила для представления ограничений для этих обеих моделей содержания.* * Объявления содержания элемента или атрибута в схеме DTD называется моделью содержания для этого элемента или атрибута. Элементы в любом документе XML – это фундаментальные структуры, которые объединены для представления экземпляра XML. Каждый элемент должен быть объявлен в схеме DTD вместе с объявлением его типа. Объявление типов элементов имеет следующий вид: <!ELEMENT имя_элемента(модель содержания)> 1. Хорошо оформленный экземпляр XML <?xml version = “1.0”?> <note>текст</note> 2.-//- и правильный(со внедр. схемой DTD) <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note (#PCDATA )> ]> <note>текст</note> Элемент note содержит только текст и ничего больше. Этот документ можно проверить, создав схему DTD с объявлением типа элемента, указывающим на то, что элемент содержит только зарезервированное ключевое слово #PCDATA или текст. PCDATA – это обычные текстовые данные, но они считываются парсером XML и обрабатываются должным образом. Если в разметке документа есть ключевое слово #PCDATA, это повлияет на обработку всего документа, что может быть как желательным, так и нежелательным. CDATA – это тоже текст, но он не обрабатывается парсером (кроме символов <, >, &, ’’). Строка 1 - нужно использовать версию 1.0 спецификации XML. Строка 2- объявление определенного типа документа, которое дается в прологе документа XML: <!DOCTYPE …> Существует объявление элемента note, в [ ] – внутренняя схема DTD. Здесь note – корневой элемент. Строка 3 – объявление типа элемента для note. Здесь указано, что note может содержать только текстовые данные. В () указывается модель содержания, которая сообщает парсеру, что следует ожидать от каждого элемента XML в документе. Строка 4 означает закрытие внутренней схемы DTD и указывает обработчику, что дальше следует документ XML. Строка 5 содержит элемент note вместе с его текстовым содержанием(#PCDATA). Элементы могут быть контейнерами для других элементов. Таким элементом обычно выступает корневой элемент документа XML. В данном случае для создания схемы DTD нужно указать, что элемент note содержит элемент message, а не текстовые данные. Затем объявить элемент message вместе с его текстовым содержанием (#PCDATA), т.к. д.б. объявлены все элементы экземпляра XML – именно эта часть структуры и подкрепляется с помощью схемы DTD. 1. *Элемент, содержащий только 1 дочерний экземпляр <?xml version = “1.0”?> <note> <message>Дочерний экземпляр</message> </note> 2.Определение типа документа для элемента* <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note (message)> <!ELEMENT message(#PCDATA )> ]> <note> <message>Дочерний экземпляр</message> </note> Пустые элементы обычно используются для подстановки или же для предоставления требуемых значений атрибутов, которые должным образом не изменяют другие элементы. Добавим пустой элемент number. Для этого объявим, что корневой элемент note содержит number, и укажем в модели содержания, что элемент пуст (не содержит ни текстовые данные, ни другие элементы), при помощи слова EMPTY. 1.Пустой элемент в документе XML <?xml version = “1.0”?> <note> <number /> <message>текст</message> </note> 2.Опредение типа документа для пустого элемента <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note (number, message)> <!ELEMENT number EMPTY> <!ELEMENT message(#PCDATA )> ]> <note> <number /> <message>текст</message> </note> Иногда мы знаем, что некий элемент не пустой (что-то содержит), но не уверенны, какая именно модель содержания нужна, тогда используется ключевое слово ANY. Оно снимает целый ряд ограничений с модели содержания, т.е. элемент может содержать данные любого типа, независимо от конкретных имен и порядка. Чтобы документ считался правильным, необходимо добавить строку <!ELEMENT date EMPTY>, без нее документ не будет правильным. Мы не можем включать в экземпляр XML элементы, которые не были объявлены в схеме DTD. 1.Добавление еще одного дочернего элемента к note <?xml version = “1.0”?> <note> <number /> <message>текст</message> <date /> </note> 2.Определение содержания для элемента note <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note ANY > <!ELEMENT number EMPTY> <!ELEMENT message(#PCDATA )> <!ELEMENT date EMPTY> ]> <note> <number /> <message>текст</message> <date /> </note> Эти модели используются, когда необходимо установить правило, которое разрешало бы элементу содержать некоторую комбинацию текстовых данных и других элементов. Если корневой элемент содержит текст, то нужно заранее объявить его смешанное содержание при помощи знаков “|”- “или” и “*”- элемент может использоваться несколько раз или не использоваться вообще . 1.Смешанное содержание элемента <?xml version = “1.0”?> <note>Важная заметка <number /> <message>текст</message> <date /> </note> 2.Проверка правильности элемента с помощью модели смеш.содерж. <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note (#PCDATA | number | message | date)* > <!ELEMENT number EMPTY> <!ELEMENT message(#PCDATA )> <!ELEMENT date EMPTY> ]> <note>Важная заметка <number /> <message>текст</message> <date /> </note> Содержание Синтаксис Интерпретация Элемент(ы) <!ELEMENT имя (дочерний _элемент1, дочерний элемент2)> Этот элемент может содержать только дочерние элементы Смешанное <!ELEMENT имя (#PCDATA , дочерний элемент)*> Содержит комбинацию текстовых данных и дочерних элементов EMPTY <!ELEMENT имя EMPTY> Этот элемент ничего не содержит ANY <!ELEMENT имя ANY> Может содержать текстовые данные или дочерние элементы Превратим пустые элементы number и date в атрибуты элемента message, поскольку они дополняют именно его. Объявление атрибутов представляется в следующем виде: <!ATTLIST имя_элемента имя_атрибута1 (тип) значение по умолчанию имя_атрибута2(тип)значениепо умолчанию> 1. Экземпляр XML с атрибутами <?xml version = “1.0”?> <note> <message number=“10” date=“073001”> текст</message> </note> Существует 3 фундаментальных типа атрибутов, объявляемых в рамках системы DTD: Строки, указываемые с помощью ключевого слова CDATA. 2. Маркированные атрибуты, указываемые с помощью определенных раньше маркеров. 3. Атрибуты с перечислением, предлагающие целый список допустимых значений. 1. Значение Интерпретация #REQUIRED Указывает на то, что атрибут должен быть указан Указывает на фиксированное значение атрибута. Если значение атрибута отличается от объявленного, документ не считается правильным Атрибут необязателен. Это означает, что если для элемента атрибут не указан, приложение при обработке может использовать любое значение (если в этом есть необходимость) #FIXED #IMPLIED 1.Определение типа документа с помощью ATTLIST <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note (message)> <!ELEMENT message (#PCDATA)> <!ATTLIST message number CDATA #REQUIRED date CDATA #REQUIRED> ]> <note> <message number=“10” date=“073001”> Определение типа документа</message> </note> 1. Правильный экземпляр XML с #FIXED <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note (message)> <!ELEMENT message (#PCDATA)> <!ATTLIST message number CDATA #REQUIRED date CDATA #REQUIRED from CDATA #FIXED “Отправитель”> ]> <note> <message number=“10” date=“073001” from=“Отправитель”> Фиксированное значение атрибута</message> </note> 1.Правильный экземпляр XML с атрибутом #IMPLIED <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note (message)> <!ELEMENT message (#PCDATA)> <!ATTLIST message number CDATA #REQUIRED date CDATA #REQUIRED from CDATA #FIXED “Отправитель” status CDATA #IMPLIED> ]> <note> <message number=“10” date=“073001” from=“Отправитель” status=“urgent”> Фиксированное значение атрибута</message> </note> Значение ID IDREF ENTITY NMTOKEN Интерпретация Уникальным образом идентифицирует элемент (начинается с буквы, : или _, в каждой инструкции м.б. только один ID) Указывает на элементы, содержащие ID Ссылка на внешний элемент Содержит буквы, цифры, точки, знаки подчеркивания, переносы и двоеточия, но не пробелы Ситуация: приложение сохраняет короткие сообщения. Каждому сообщению присваивается уникальный идентификатор (атрибут number). Это же приложение сохраняет элементы outcome и связывает их с определенным элементом message (с помощью атрибута msg), для дальнейшей обработки. <?xml version = “1.0”?> <!DOCTYPE note [ <!ELEMENT note (message+, outcome+)> <!ELEMENT message (#PCDATA)> <!ATTLIST message number ID #REQUIRED from CDATA #REQUIRED> <!ELEMENT outcome (#PCDATA)> <!ATTLIST outcome msg IDREF #IMPLIED> ]> <note> <message number=“a1” from=“KS”>текст1</message> <message number=“a2” from=“GS”>текст2</message> <message number=“a3” from=“GK”>текст3</message> <outcome msg=“a1”>к первому</outcome> <outcome msg=“a2”>ко второму</outcome> </note> ENTITY – это ссылки, позволяющие реализовать подстановку строк. Объявление и определение ссылок или подстановочных элементов осуществляются в схеме. Когда обработчик XML доходит до подстановочного элемента, он заменяется соответствующими, заранее определенными данными. На наличие подстановочного элемента указывает “&”, “;” ограничивает ссылку: &ссылка; <… [ … <!ENTITY today “073001”> …]> <note><message>&today; - текст</message></note> <note><message>073001 - текст</message></note> Тип NMTOKEN позволяет наложить ограничение на допуcтимые символы в содержании XML (только буквы, цифры, точки, -, :, _). <…[ … phone NMTOKEN #REQUIRED …]> <note>… phone=“123-456-789” …</note> <note>… phone=“123 456 789” …</note> неправильный вариант использования с “ ”. Атрибуты типов с перечислением содержат список допустимых значений, из которых можно выбирать любое. Значения из списка указываются с помощью знака “|” – логическое “или”. <… [ … alert ( low | normal | urgent) “normal”…]> <note>…alert=“low” …</note> <note>… …</note> // alert=“normal” <… [ … alert ( low | normal | urgent) #IMPLIED…]> <note>… …</note> // необязательный Индикаторы последовательностей иногда называют соединителями (connector), так как они служат для соединения или установления взаимосвязи между двумя или большим числом элементов. Символ Пример Интерпретация , ( a, b, c) Оператор последовательности разделяет члены списка, когда необходимо последовательное использование членов списка (сначала a, затем b, после этого c) | ( a|b|c) Оператор выбора разделяет члены списка, когда необходимо использовать только один из членов списка date Отсутствие какого-либо символа указывает на необходимое вхождение одного и только одного элемента date ? subject? Этот символ указывает на необязательное вхождение (нуль или один раз) элемента subject + paragraph+ Указывает на обязательное и повторяющееся вхождение(один или несколько раз) элемента paragraph * brother* Указывает на необязательное и повторяющееся вхождение(нуль или несколько раз) элемента brother Для проверки документов XML с использованием схемы DTD необходим соответствующий парсер. Он поставляется в виде COM-объекта вместе с Internet Explorer-ом, хотя и не используется браузером. Для получения доступа к нему следует создать объект парсера в браузере с помощью сценария(JavaScript, VBScript). Или загрузить с узла MSDN (http://msdn.microsoft.com/downloads/samples/internet/xml /xml_validator/ ). Отличие внешней схемы DTD от внутренней в том, что она сохраняется в виде отдельного файла с расширением .DTD. Для упрощения лучше хранить документы XML, схемы DTD и сценарии парсера в одной папке. Чтобы указать внешнюю схему DTD, необходимо в объявлении типа документа включить слово SYSTEM или PUBLIC, после указать адрес URL файла , содержащего DTD. PUBLIC – схема общедоступна и совместно используется многими пользователями, обычно хранится в репозитарии. <!DOCTYPE корневой_элемент SYSTEM “myrules.DTD”> Повторим то, что узнали сегодня. Этот подход унаследован от языка SGML. В котором он использовался на протяжении многих лет. Схемы DTD (как и любые другие схемы XML) предоставляют шаблон разметки документа, в котором определяется наличие, порядок и расположение элементов и их атрибутов в документе XML. Дерево DTD само по себе не содержит повторяющихся элементов или структур. Однако его структура обеспечивает повторение элементов в соответствующем правильном экземпляре XML. Объявление типа документа, которое располагается в прологе документа XML, связывает схему DTD с документом. Как только разработчик сталкивается с подобным объявлением, он загружает схему DTD и проверяет документ XML на соответствие всем ограничениям, изложенным в этой схеме. Ключевое слово ANY допускает любое содержание элемента – или данные, или другие элементы. Смешанное содержание позволяет элементам содержать комбинацию текстовых данных и элементов. Ключевое слово EMPTY указывает на отсутствие в элементе какого-либо содержания. Содержание можно объявить для элементовконтейнеров прямо в документе XML. Все парсеры XML делятся на две группы – 1) способные проверять документы на соответствие ограничениям, изложенным в схеме DTD или подобной схеме другого типа; 2) не обладающие подобными возможностями. Парсер второго типа может определить только то, что документ XML хорошо оформлен, т.е. соответствует основным синтаксическим правилам XML. Парсер первого типа способен пойти дальше, определив то, что документ XML хорошо оформлен, но и то, что он соответствует всем ограничениям, заданным в связанной с ним схеме. Проверьте свои знания, полученные в результате изучения материала настоящего урока. Cоздайте свою схему DTD для проверки файлов.