XML технологии Раздел 2 Описание XML документа Тема: DTD DTD - Document Type Definition Документ XML может: быть не предназначен для вашей системы; содержать неправильные данные; содержать ошибки в структуре. XML документ с корректной синтаксической структурой является "синтаксически верным“ (Well Formed). XML документ, прошедший проверку по DTD, является "синтаксически верным" (Well Formed) и "валидным“ (Valid). "Валидный" XML документ — это "синтаксически верный" XML документ, который также соответствует правилам DTD (определениям типов документов). DTD является способом точного описания языка XML. DTD проверяют словарный запас и правильность структуры документов XML на соответствие грамматическим правилам соответствующего языка XML. XML DTD может быть либо задан внутри документа, либо он может храниться в отдельном документе, а затем использоваться отдельно. Цель DTD состоит в том, чтобы определить структуру XML документа. Это делается путем определения списка допустимых элементов. 2 DTD - Document Type Definition Зачем нужно использовать DTD? С DTD ваш XML файл может нести собственный формат. С DTD различные, не связанные друг с другом группы людей, могут приходить к соглашению о стандартах пересекающихся данных. С DTD вы можете быть уверены, что получаемые из внешних источников данные будут корректными. Когда не стоит использовать DTD? Вообще-то для работы XML не требуется DTD. Когда вы экспериментируете с XML или работаете с небольшими XML файлами, то создание DTD может оказаться излишней тратой времени. Если вы разрабатываете приложения, то стоит подождать, пока спецификации не станут стабильными, и только тогда добавлять определения. В обратном случае ваше приложение может перестать работать из-за ошибок валидации. 3 DTD - Document Type Definition Язык описания структуры документа. DTD описывает: 1. Какие элементы могут присутствовать в документе. 2. Количество элементов. 3. Какие атрибуты могут быть у элементов. 4. Обязательность атрибутов. 5. Описание сущностей. Пример использования DTD: XML документ <address> <name>Tanmay Patil</name> <company>TutPoint</company> <phone>(011) 123-4567</phone> </address> DTD схема <?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> 4 Синтаксис DTD Определение (декларация) DTD Для того чтобы использовать схему DTD в нашем документе, мы можем: 1) описать ее во внешнем файле (c расширением .dtd ) и при описании схемы DTD просто указать ссылку на этот файл (внешняя схема DTD). Синтаксис: <!DOCTYPE имя_элемента SYSTEM “имя_файла.dtd”> Пример_1 <?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE example SYSTEM “example.dtd”> <example>Это внешняя схема</example> (или <!DOCTYPE example PUBLIC "http://site.ru/ example.dtd">) В нашем примере во второй строке указано: DOCTYPE example определяет, что корневым элементом документа является example. Схема DTD находится во внешнем файле example.dtd. 5 Синтаксис DTD Определение (декларация) DTD Для того чтобы использовать схему DTD в нашем документе, мы можем: 2) непосредственно внутри самого документа выделить область, в которой определить нужные правила (внутренняя схема DTD). Синтаксис: <!DOCTYPE имя-корневого-элемента []> Квадратные скобки [] - это место, где необходимо объявить элементы. Пример_2 <?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE example [ <!ELEMENT example (#PCDATA)> ] <example>Это внутренняя схема</example> В нашем примере во второй строке указано: DOCTYPE example определяет, что корневым элементом документа является example. Схема DTD находится внутри, в ней описан элемент example, в котором содержатся только символьные данные. 6 Синтаксис DTD Определение (декларация) DTD Пример_3 Простой пример внутреннего DTD <?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> <address> <name>Иванов Роман</name> <company>Глобус-инк</company> <phone>8(863)2202202</phone> </address> Объясните, какие элементы описаны во внутренней схеме DTD? 7 Синтаксис DTD Объявление элементов Все элементы можно разделить на: 1) элементы-контейнеры, которые могут содержать: а) данные (например, текст); б) дочерние элементы; в) и то, и другое (смешанное содержимое); 2) пустые элементы. Синтаксис: <!ELEMENT имя-элемента (тип - что внутри?)> Содержимое элементов: EMPTY – пустой (например <br />) ANY – любое содержимое (встречается редко) (#PCDATA) – только символьные данные (список имен вложенных элементов ч.з. запятую) – вложенные элементы должны следовать в документе в том порядке, в котором они перечислены в объявлении. Объявляется только один уровень вложенности. Элементы можно группировать скобками. Использование разделителя “|” между элементами указывает, что встречается один из разделенных элементов. После элементов или скобок идут квантификаторы: + - от одного и больше * - от нуля и больше ? - ноль или один Квантификаторы применяются для указания какое количество раз может повторяться элемент или его дочерние элементы. 8 Синтаксис DTD Объявление элементов Пример_4 <!--Элемент book, содержащий дочерний элемент title--> <!ELEMENT book (title)> <!--Элемент book, содержащий дочерние элементы title--> <!ELEMENT book (title, author, price)> <!--Элемент wheather, содержащий один из дочерних элементов celsius или fahrenheit --> <!ELEMENT wheather (celsius | fahrenheit)> <!--Элемент title, содержащий только символьные данные--> <!ELEMENT title (#PCDATA)> <!--Пустой элемент br--> <!ELEMENT br EMPTY> 9 Синтаксис DTD Объявление атрибутов Атрибуты объявляются после объявления самого элемента. Все атрибуты одного элемента объявляются сразу, одним списком. Синтаксис: <!ATTLIST имя-элемента имя-атрибута тип-значения обязательность> Стандартные значения атрибутов: #REQUIRED атрибут должен быть указан #FIXED значение атрибута фиксировано. Если значение атрибута отличается от объявленного, документ не считается правильным #IMPLIED атрибут необязателен “значение_по_умолчанию” если в документе опустить атрибут, ему будет назначено значение по умолчанию, указанное в кавычках 10 Синтаксис DTD Объявление атрибутов 1) 2) 3) Существуют 3 типа атрибутов: атрибуты, содержащие текстовые данные, указываемые с помощью ключевого слова CDATA; маркированные атрибуты, указываемые с помощью определенных ранее маркеров; ID Уникальным образом идентифицирует элемент (значение атрибута должно начинаться с буквы или символа «_») IDREF Указывает на элементы, содержащие атрибут ID ENTITY Ссылка на внешний элемент NMTOKEN Содержит буквы, цифры, точки, знаки подчеркивания, переносы и двоеточия, но не пробелы атрибуты с перечислением, предлагающие целый список допустимых значений (при перечислении используется знак |, который воспринимается как логический оператор «или»). 11 Синтаксис DTD Объявление атрибутов Пример_5 <!--Объявление необязательного атрибута currency элемента price. Тип атрибута currency – символьные данные--> <!ATTLIST price currency CDATA #IMPLIED> <!--Объявление обязательного атрибута id элемента department. Тип атрибута id – идентификатор элемента ID--> <!ATTLIST department id ID #REQUIRED> <!--Объявление необязательного атрибута department элемента person. Тип атрибута department – указатель на элемент, содержащий атрибут ID--> <!ATTLIST person department IDREF #IMPLIED> 12 Синтаксис DTD Объявление сущностей В языке XML есть возможность продекларировать фрагменты содержания, а затем ссылаться на них при необходимости, что позволяет сэкономить время и силы разработчикам. Объявляя сущность в DTD мы определяем ее имя и содержание, на которое она ссылается. Ссылаясь на сущность, мы заставляем анализатор заменить ссылку на содержимое сущности. Сущности бывают анализируемыми (parsed entity) - содержимое сущности анализируется, т.е, например, при встрече в нем ссылок на другие сущности, они так же замещаются их содержимым; разметка внутри таких сущностей так же интерпретируется. неанализируемыми (unparsed entity) - это не обязательно текст в XML формате, или совсем не текст (графика или другое мультимедиа содержание). 13 Синтаксис DTD Объявление сущностей Ниже приведен пример объявления и использования анализируемых сущностей author и copyright (обратите внимание: сущность copyright ссылается на author): Строка <!ENTITY author "Иванов Иван Иванович"> объявляет сущность author со значением "Иванов Иван Иванович". Ссылка на сущность выглядит как символьная подстановка в HTML: &author;. При разборе документа анализатор встретит ссылку на сущность и заменит ее на значение сущности. 14 Синтаксис DTD Объявление сущностей В итоге документ примет следующий вид: Из приведенного рисунка видно, что ссылка на сущность &author; была заменена ее содержимым "Иванов Иван Иванович", причем и в "теле" другой сущности - &copyright;. Анализируемые сущности могут также содержать и разметку. 15 Синтаксис DTD Определение (декларация) DTD Пример_6 XML документ DTD схема 16 Синтаксис DTD Определение (декларация) DTD Пример_7 XML документ DTD схема ДОБАВИТЬ ПРИМЕР с ССЫЛКОЙ НА АТРИБУТ, КАК В КТ-1!!! 17 Валидация Notepad++ Plugins --> XML Tools --> Validate now XML Copy Editor XML --> Проверить --> DTD/XML Schema Онлайн валидатор (их много) https://www.xmlvalidation.com 18 С чего начать DTD? Начинайте написание DTD с дерева XML! XML документы формируют древовидную структуру, которая начинается с "корневого" элемента и разветвляется на "дочерние" элементы. Рассмотрим пример XML и дерево элементов: Изобразите на листе бумаги дерево элементов Вашего файла XML. Так будет проще ориентироваться при создании схемы DTD! 19 20 практика Задача 1 Дан следующий xml документ: 2. Создайте DTD схему и проверьте XML документ на валидность. Не забудьте о квантификаторах! 1. 21 практика Задача 2 1. 2. 3. 4. В созданном на прошлом занятии XML документе удалите пространства имён и откорректируйте имена соответствующих элементов. Создайте DTD схему для документа XML. Проверьте созданный файл на синтаксис. Проверьте валидность XML документа схеме DTD с помощью онлйн валидатора https://www.xmlvalidation.com. Предоставьте XML документ и схему DTD на проверку преподавателю. 22