Что означает dtd описание документа. Введение в XML DTD. Перечисляемые атрибуты со значением по умолчанию

Viber OUT 22.03.2019

Как раз таковыми и являются. Причём XML сам по себе предусматривает расширяемость. Документы созданные с помощью этих языков могут быть «корректными (well-formed)» и «допустимыми (valid)».

С проверкой документа на корректность проблем не возникает: если ошибок не выскочило и всё отобразилось так, как мы хотели, то документ корректен. Например, если в HTML-документе написать что-то вроде « Привет! », то наш документ будет полностью корректен, но проигнорирован браузером. Почему? Потому что браузер ничего не знает о том, что это за «Z» такой. И если мы проверим наш документ на допустимость с помощью валидатора , то документ таковым признан не будет. А как об этом узнает валидатор и на основании чего он вынес такой вердикт?

Допустимость проверяется с помощью определения типа документа (DTD, document type definition). Например, для «строгого» HTML он выглядит так .

DTD может быть описан как внутри документа, так и вынесен в отдельный файл (аналогия с CSS: встроенные и подключаемые таблицы стилей).

Объявление DTD

Объявление DTD располагается перед первым (корневым) элементом документа, начинается с последовательности « ».

Внутреннее DTD описывается так:

Между квадратными скобками располагается содержимое DTD, так называемое внутреннее подмножество , например:

] >

Если DTD вынесено в отдельный файл (обычно имеющий расширение.dtd), то его объявление в документе записывается так:

Соответственно, в этом файле и прописываются все правила, так называемое внешнее подмножество .

Имя, указанное за словом « DOCTYPE » (в нашем случае « catalog »), должно соответствовать имени корневого элемента. То есть, XML-документ должен быть примерно таким:

Hello, world!

Вместо ключевого слова « SYSTEM » может быть использовано слово « PUBLIC », указывающее, что DTD применяется для широкого использования:

Внутренние и внешние подмножества могут быть заданы одновременно (опять же, аналогия с CSS):

] >

Здесь, сначала зачитывается содержимое файла « catalog.dtd », а потом содержимое, указанное внутри квадратных скобок.

Элементы документа

Элементы объявляются в DTD с помощью ключевого слова « ELEMENT », после которого следует имя элемента и его содержимое заключенное в круглые скобки:

Если у элемента есть дочерние элементы, то это записывается так:

что соответствует документу:

</book> </p><p>Если у элемента несколько дочерних элементов, то они перечисляются через запятую и должны следовать строго в указанном порядке:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> </p><p>Приведённый выше пример читается <a href="/proksi-sleduyushchim-obrazom-znachenie-kak-polzovatsya-proksi-serverom-osnovnye/">следующим образом</a>. Элемент « book » должен содержать только один элемент « title », за которым должен следовать только один элемент « author ». Сами элементы « title » и « author » никаких элементов не содержат, а могут содержать лишь какой-нибудь текст.</p> <p>С помощью следующих <a href="/klassnye-smailiki-iz-simvolov-specialnye-simvoly-dlya-nika/">специальных символов</a> можно определять количественное присутствие элемента:</p> <ul><li>Символ « * », следующий после элемента, означает, что элемент может присутствовать один или несколько раз, или не присутствовать вовсе(от нуля до + бесконечности)</li> <li>Символ « + », следующий после элемента, означает, что элемент может присутствовать один или несколько раз(от 1 до + бесконечности)</li> <li>Символ « ? », следующий после элемента, означает, что элемент может либо отсуствовать, либо присутствовать только один раз(0 или 1)</li> </ul> <!ELEMENT book (title, author)> ... <!ELEMENT book (title*, author)> ... <!ELEMENT book (title+, author)> ... <!ELEMENT book (title?, author)> <p>Если существует необходимость указать один из нескольких элементов (или title, или author — любой из них, но не оба), надо испольовать символ « | »:</p><p> <!ELEMENT book (title | author)> </p><p>Текст тоже равноправный участник игры. <a href="/podbor-klyuchevyh-slov-ot-a-do-ya-kakiie-klyuchevye-slova-ot-otdelnyh/">Ключевое слово</a> « PCDATA » указывает на анализируемые символьные данные, поэтому любой текст содержащий символы разметки (« < », « > » и « & ») будет трактоваться как разметка. <a href="/programma-dlya-zapisi-dialogov-v-skaipe-instrukciya-kak-zapisat-razgovor-v/">Совместное использование</a> текста и элементов называется <i>смешанным содержимым </i>. При объявлении смешанного содержимого, « PCDATA » необходимо указывать первым:</p><p> <!ELEMENT book (#PCDATA | title | author)> </p><p>Следующий фрагмент документа валиден вышеприведенному примеру:</p><p> <book> <title /> </book> <book> <author /> </book> <book> Нет данных </book> </p><p>Группы элементов заключаются в круглые скобки. Элемент « book » должен содержать либо текст, либо (один « title », один или неколько « author » и может быть один « pubyear » именно в таком порядке):</p><p> <!ELEMENT book (#PCDATA | (title, author+, pubyear?))> <!ELEMENT disc (#PCDATA | title)*> </p><p>Данному примеру соответствует следующий фрагмент XML-документа:</p><p> <disc /> <book> <title /> <author /> <author /> </book> <book> Нет данных </book> </p><p>Элемент может быть пустым. Такой элемент не может содержать не дочерних элементов ни текста (например, элемент « br » в HTML). Такой элемент задается с ключевым словом « EMPTY »:</p><p> <!ELEMENT photo EMPTY> </p><p>Элемент также может быть объявлен с ключевым словом « ANY » означающее, что элемент может содержать и элементы, и текст, и все это вместе, и даже быть пустым.</p> <h3>Атрибуты элементов</h3> <p>Элементы в XML-документе могут иметь атрибуты, которые записываются в виде « имя = значение » в открывающем или пустом тегах. Общее объявление атрибутов конкретного элемента начинается с ключевого слова « ATTLIST », после которого следует имя <a href="/kak-sozdayutsya-pravila-v-css-sintaksis-css-i-zadat-stil-dlya-ukazannogo/">данного элемента</a> и объявления самих атрибутов:</p><p> <!ELEMENT title (#PCDATA)> <!ATTLIST title id CDATA #REQUIRED stock CDATA #IMPLIED> </p><p>Ключевое слово « REQUIRED » указывает на то, что атрибут обязателен. Ключевое слово « IMPLIED », наоборот, говорит, что атрибут необязателен.</p> <p>У атрибутов могут быть перечисленны разрешенные значения:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED> </p><p>Также может быть задано значение по-умолчанию:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED "yes"> pubyear CDATA #IMPLIED "2007"> </p><p>Атрибут может быть и константой, то есть у него может быть только то значение, которое заявлено в объявлении атрибута. Делается это с помощью ключевого слова « FIXED »:</p><p> <!ATTLIST title copyright <strong>#FIXED "udvikler"> </p><p>Тип атрибута « CDATA »позволяет использовать любые символы кроме « < », « > », « & », « " » и « " ». В случае использования, данные символы должны быть заменены на спецсимволы типа « < » и т.п. Внимание : в DTD ключевое слово « CDATA » имеет другое значение, чем раздел « CDATA » в XML-документе!</p> <p>Помимо типа CDATA, атрибуты могут иметь <a href="/failovaya-sistema-fat-podderzhivaet-sleduyushchie-tipy-failov-failovye/">следующие типы</a>:</p> <ul><li>NMTOKEN - может содержать только буквы, цифры, « . », « - », « _ » и « : »</li> <li>NMTOKENS - может содержать те же символы, что и « NMTOKEN », а также символы пробела, возврата каретки, перевода строки и табуляции</li> </ul> <!ATTLIST title id CDATA #REQUIRED stock NMTOKEN #IMPLIED publisher NMTOKENS #IMPLIED> <p>Еще один тип атрибута « ID » разрешает задавать те же значения, что и тип NMTOKEN, но начинаться значение должно либо с буквы, либо с « _ », либо с « : ». У любого элемента может быть только один атрибут с типом « ID ». Атрибут типа « ID » не может быть константой (объявляться как « FIXED »). Значение атрибута типа « ID » должно быть уникальным для всего XML-документа:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ATTLIST title id ID #REQUIRED stock CDATA #IMPLIED> <!ATTLIST author id ID #REQUIRED city CDATA #IMPLIED> </p><p>Атрибут элемента может быть ссылкой на атрибут типа « ID » другого элемента. Для этого он объявляется как атрибут типа « IDREF ». Если атрибут должен ссылаться на атрибут типа « ID » нескольких элементов, то испольуется ключевое слово « IDREFS »:</p><p> <!ELEMENT book (title+, author, year, publisher)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ATTLIST title id ID #REQUIRED> <!ATTLIST author id ID #REQUIRED> <!ATTLIST year ref IDREF #REQUIRED> <!ATTLIST publisher from IDREFS #REQUIRED> </p><p>В XML-документе это будет выглядить так:</p><p> <book> <title id="t1" /> <title id="t2" /> <title id="t3" /> <author id="a1" /> <year ref="t2" /> <publisher from="t1 t2 a1" /> </book> </p><h3>Объявление сущностей</h3> <p>Помимо элементов и их атрибутов, мы можем определить <i>сущности </i>, записываемые с помощью ключевого слова « ENTITY »:</p><p> <!ENTITY name "SuperMegaMaster"> </p><p> <userName>&name;</userName> </p><p>В результате чего, на место имени сущности « name », будет подставлено ее значение, в нашем случае — « SuperMegaMaster ».</p> <p>И для полноты нашего счастья, надо добавить, что атрибуты элементов могут иметь в качестве значения подобные сущности — <i>сущности-атрибуты </i>. Они тоже определяются с помощью ключевого слова « ENTITY », но имеют одно ограничение — они должны ссылаться на внешние неанализируемые сущности, определенные во внешнем подмножестве DTD:</p><p> <!DOCTYPE catalog [ <!ENTITY list SYSTEM "companyList.html" NDATA parse> <!ELEMENT catalog (user+)> <!ELEMENT user (name)> <!ATTLIST user company ENTITY #REQUIRED> <!ELEMENT name (#PCDATA)> ] > </p><p>В вышеприведённом примере, объявлена сущность « list », которая ссылается на <a href="/izmenenie-vneshnego-vida-teksta-v-dokumente-raznica-mezhdu/">внешний документ</a> « companyList.html ». Ключевое слово « NDATA », говорит о том, что внешний документ неявляется XML-документом. Далее, для элемента « user » объявляется атрибут « company », который является обязательным и имеет тип « ENTITY », то есть ссылается на какую-либо сущность. Поскольку в нашем пример задана только одна сущность (« list »), то именно она и только она может быть значением атрибута « company » в XML-документе:</p><p> <catalog> <user company="list"> <name>SuperMegaMaster</name> </user> </catalog> </p><p>Осталось только понять, что означает « parse » в строке объявления сущности « list »? Когда используются неанализируемые данные, то есть те, которые не анализируются синтаксическим анализатором XML, хорошо было бы дать информацию приложению (использующему данный XML-документ), каким образом обработать эту сущность, если все-таки потребуется. Для этого нужно использовать нотацию, задаваемую ключевым словом « NOTATION » и дополнить наш DTD следующим образом:</p><p> <!NOTATION parse SYSTEM "iexlorer"> <!ENTITY list SYSTEM "companyList.html" NDATA parse> </p><p>Слово « parse » в объявлении сущности лист указывает на то, каким образом можно проанализировать файл « companyList.html » — найти нотацию с именем « parse » и следовать ее указаниям. В нашем случае, приложение может открыть MS InternetExplorer и загрузить в него документ « companyList.html ».</p> XML для описания подобных "самодеятельных" тэгов используются <i>схемы </i>. Они необходимы для того, чтобы:<ul><li>описать, что именно является разметкой;</li> <li>описать точно, что означает разметка.</li> </ul><p>Наиболее известными языками описания схем являются следующие:</p><ul><li>DTD (Document <i> </i> Type <i> </i> Definition) - язык определения типа документов, который первоначально использовался в качестве язык описания структуры SGML-документа.</li> <li> XDR (XML <i> </i> Data <i> </i> Reduced) – диалект схемы XML, разработанный Microsoft, который поддерживался в <a href="/internet-explorer-poslednyaya-obnovlyaem-brauzer-internet-explorer-do-aktualnoi-versii/">Internet Explorer</a> 4 и 5 версий.</li> <li><a href="/xml-schema-xml-shema-opisanie-struktury-xml-dokumentov-chem-otkryt-xsd-chto-xsd-shema/">XML Schema</a> или просто XSD (<i>язык определения схем </i> XML) – рекомендация консорциума W3C с 2001 года.</li> </ul><p>Рассмотрим подробнее первые два из них. Третий язык описания схем рассматривается в <a href="/volkov-commander-russkaya-versiya-rabota-s-failami-i-katalogami-v-ms-dos-i/">лабораторной работе</a> 11.</p> <h3>DTD схема</h3><p>Схема DTD предоставляет <i>шаблон </i> разметки документа, в котором указываются <i>наличие </i>, <i>порядок </i> <i>следования </i> и <i>расположение </i> <i>элементов </i> и их <i>атрибутов </i> в документе XML .</p><p>В рамках DTD модель <a href="/soderzhimoe-faila-sitemap-xml-sozdanie-sitemap/">содержимого XML</a> документа можно описать следующим образом:</p><p>Каждый <i>элемент </i> документа может иметь один из типов:</p><table border="0" class="xml_table" cellpadding="2" cellspacing="1"><tr><th bgcolor="#d8d8d8"> <b>Содержание </b> </th> <th bgcolor="#d8d8d8"> <b>Синтаксис </b> </th> <th bgcolor="#d8d8d8"> <b>Комментарий </b> </th> </tr><tr><td bgcolor="#eaeaea" valign="top">Данные </td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя (#PCDATA)> </td> <td bgcolor="#eaeaea" valign="top">Содержит только текстовые данные </td> </tr><tr><td bgcolor="#eaeaea" valign="top">Другие элементы </td> <td bgcolor="#eaeaea" valign="top"><span><!ELEMENT имя (дочерний элемент 1, дочерний элемент 2)> </span> </td> <td bgcolor="#eaeaea" valign="top">Содержит только дочерние элементы </td> </tr><tr><td bgcolor="#eaeaea" valign="top">Смешанное </td> <td bgcolor="#eaeaea" valign="top"><span><!ELEMENT имя (#PCDATA, дочерний элемент)*> </span> </td> <td bgcolor="#eaeaea" valign="top">Содержит комбинацию текстовых данных и дочерних элементов </td> </tr><tr><td bgcolor="#eaeaea" valign="top">EMPTY </td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя EMPTY> </td> <td bgcolor="#eaeaea" valign="top">Ничего не содержит </td> </tr><tr><td bgcolor="#eaeaea" valign="top">ANY </td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя ANY> </td> <td bgcolor="#eaeaea" valign="top">Может содержать текстовые данные или дочерние элементы </td> </tr></table><p>Атрибуты, находящиеся внутри тэгов документа, описываются отдельно с помощью синтаксиса:</p><p><!ATTList имя_элемента имя_атрибута1 (тип) значение_по_умолчанию …………………………………………………………………………………... имя_элемента имя_атрибутаN (тип) значение_по_умолчанию ></p><p>При этом атрибут в DTD может иметь один из трех типов:</p><ul><li>Строка</li> <li>Маркированные атрибут</li> <li>Атрибута с перечислением</li> </ul><p>Кроме типа атрибута можно также задавать и его модальность:</p><p>Рассмотрим в качестве примера описание атрибутов <i>строкового </i> типа для элемента, описывающего некоторое сообщение:</p><p><!ATTLIST message number CDATA #REQUIRED date CDATA #REQUIRED from CDATA #FIXED status CDATA #IMPLIED></p><p>Если этот элемент содержит атрибуты с <i>перечислением </i>, то их описание может выглядеть, например, следующим образом:</p><p><!ATTLIST message number ID #REQUIRED from CDATA #REQUIRED alert (low | normal | urgent) "normal"></p><p>Маркированных атрибуты элемента могут быть четырех типов:</p><p>И, наконец, в DTD можно использовать следующие индикаторы вхождения последовательностей:</p><table border="0" class="xml_table" cellpadding="2" cellspacing="1"><tr><th bgcolor="#d8d8d8"> <b>Символ </b> </th> <th bgcolor="#d8d8d8"> <b>Пример </b> </th> <th bgcolor="#d8d8d8"> <b>Описание </b> </th> </tr><tr><td bgcolor="#eaeaea" valign="top"> , </td> <td bgcolor="#eaeaea" valign="top">(a, b, c) </td> <td bgcolor="#eaeaea" valign="top">Последовательное использование элементов списка </td> </tr><tr><td bgcolor="#eaeaea" valign="top">| </td> <td bgcolor="#eaeaea" valign="top">(a | b | c) </td> <td bgcolor="#eaeaea" valign="top">Используется один из членов списка </td> </tr><tr><td bgcolor="#eaeaea" valign="top"> </td> <td bgcolor="#eaeaea" valign="top">date </td> <td bgcolor="#eaeaea" valign="top">Используется один и только один элемент </td> </tr><tr><td bgcolor="#eaeaea" valign="top"> ? </td> <td bgcolor="#eaeaea" valign="top"> subject ? </td> <td bgcolor="#eaeaea" valign="top">Необязательное использование (0 или 1 раз) </td> </tr><tr><td bgcolor="#eaeaea" valign="top">+ </td> <td bgcolor="#eaeaea" valign="top">paragraph+ </td> <td bgcolor="#eaeaea" valign="top">Используется один или несколько раз </td> </tr><tr><td bgcolor="#eaeaea" valign="top">* </td> <td bgcolor="#eaeaea" valign="top">brother* </td> <td bgcolor="#eaeaea" valign="top">Используется ноль или несколько раз </td> </tr></table><p>В качестве примера приведем DTD схему, описывающую структуру электронного <a href="/sozdat-elektronnuyu-pochtu-pochtovyi-yashchik-zavesti-pochtovyi-yashchik-na-gmail-com/">почтового ящика</a>:</p><p><!ELEMENT mailbox (message*)> <!ELEMENT message (head, body)> <!ATTLIST message uid CDATA #REQUIRED> <!ELEMENT head (from,to+, subject?, CC*, notify?) > <!ELEMENT from (#PCDATA)> <!ELEMENT to (#PCDATA)> <!ELEMENT subject (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT notify EMPTY> <!ELEMENT body (#PCDATA)></p> <h3></h3> <p>В <b>XML </b>- документах <b>DTD </b> определяет набор действительных элементов, идентифицирует элементы, которые могут находиться в других элементах, и определяет действительные атрибуты для каждого из них. Синтаксис <b>DTD </b> весьма своеобразен и от автора-разработчика требуются дополнительные усилия при создании таких документов(сложность <b>DTD </b> является одной из причин того, что использование <b>SGML </b>, требующего определение <b>DTD </b> для любого документа, не получило столь широкого <a href="/sposoby-rasprostraneniya-failov-sposoby-kak-mozhno-zarabotat-na-failoobmennikah/">распространения как</a>, например, <b>HTML </b>). Как уже отмечалось, в <b>XML </b> использовать <b>DTD </b> не обязательно - документы, созданные без этих правил, будут правильно обрабатываться программой-анализатором, если они удовлетворяют основным требованиям синтаксиса <b>XML </b>. Однако контроль за типами элементов и корректностью отношений между ними в этом случае будет полностью возлагаться на автора документа. До тех пор, пока грамматика нашего нового языка не описана, его сможем использовать только мы, и для этого мы будем вынуждены применять специально разработанное <a href="/kriterii-i-standarty-kachestva-programmnogo-obespecheniya/">программное обеспечение</a>, а не универсальные программы-анализаторы.. </p> <p>В <b>DTD </b> для <b>XML </b> используются следующие типы правил: правила для элементов и их атрибутов, описания категорий(макроопределений), описание форматов бинарных данных. Все они описывают основные конструкции языка - элементы, атрибуты, символьные константы внешние файлы бинарных данных. </p> <p>Для того, чтобы использовать <b>DTD </b> в нашем документе, мы можем или описать его во внешнем файле и при описании <b>DTD </b> просто указать ссылку на этот файл или же непосредственно внутри самого документа выделить область, в которой определить нужные правила. В первом случае в документе указывается имя файла, содержащего <b>DTD </b>- описания: </p> <span><?xml version="1.0" standalone="yes" ?> <! DOCTYPE journal SYSTEM "journal.dtd"> ... </span> <p>Внутри же документа DTD- декларации включаются следующим образом: </p> <span>... <! DOCTYPE journal [ <!ELEMENT journal (contacts, issues, authors)> ... ]> ... </span> <p>В том случае, если используются одновременно внутренние и <a href="/kartrider-dlya-kart-pamyati-chto-delat-esli-on-ne-rabotaet/">внешние описания</a>, то программой-анализатором будут сначала рассматриваться внутренние, т.е. их приоритет выше. При проверке документа <b>XML </b>- процессор в первую очередь ищет <b>DTD </b> внутри документа. Если правила внутри документа не определены и не задан атрибут </span>standalone ="yes" <span> , то программа загрузит указанный внешний файл и правила, находящиеся в нем, будут считаны оттуда. Если же атрибут <b>standalone </b>имеет значение "<b>yes" </b>, то использование внешних <b>DTD </b> описаний будет запрещено. </p> <h4><span>Определение элемента </span></h4> <p>Элемент в <b>DTD </b> определяется с помощью дескриптора!<b>ELEMENT </b>, в котором указывается название элемента и структура его содержимого. </p> <p>Например, для элемента <flower> можно определить следующее правило: </p> <!ELEMENT flower PCDATA> <p>Ключевое слово <b>ELEMENT </b> указывает, что данной инструкцией будет описываться элемент <b>XML </b>. Внутри этой инструкции задается название элемента<b> (flower) </b>и тип его содержимого. </p> <p>В определении элемента мы указываем сначала название элемента<b>(flower) </b>, а затем его модель содержимого - определяем, какие другие элементы или типы данных могут встречаться внутри него. В <a href="/chto-takoe-interfeis-aero-kak-vklyuchit-windows-aero-i-stoit-li-ono-togo-v-dannom/">данном случае</a> содержимое элемента flower будет определяться при помощи специального маркера <b>PCDATA </b>(что означает </span>parseable character data <span> - любая информация, с которой может работать программа-анализатор). Существует еще две инструкции, определяющие тип содержимого: <b>EMPTY </b>,<b>ANY </b>. Первая указывает на то, что элемент должен быть пустым(например, </span><red/> <span>), вторая - на то, что содержимое элемента специально не описывается. </p> <p>Последовательность дочерних для текущего элемента объектов задается в виде списка разделенных запятыми названий элементов. При этом для того, чтобы указать количество повторений включений этих элементов могут использоваться символы +,*, ? : </p> <span><!ELEMENT issue (title, author+, table-of-contents?)> </span> <p>В этом примере указывается, что внутри элемента <issue> должны быть определены элементы <b>title </b>, <b>author </b> и <b>table-of-contents </b>, причем элемент <b>title </b> является обязательным элементом и может встречаться лишь однажды, элемент author может встречаться несколько раз, а элемент <b>table-of-contents </b>является опциональным, т.е. может отсутствовать. В том случае, если существует несколько возможных вариантов содержимого определяемого элемента, их следует разделять при помощи символа <b>"|" </b>: </p> <span><!ELEMENT flower (PCDATA | title)*> </span> <p>Символ <b>* </b>в этом примере указывает на то, что определяемая последовательность <a href="/sozdanie-ramki-s-pomoshchyu-html-css-border-granicy-elementa-vneshnii-i/">внутренних элементов</a> может быть повторена несколько раз или же совсем не использоваться. </p> <p>Если в определении элемента указывается "смешанное" содержимое, т.е. текстовые данные или набор элементов, то необходимо сначала указать <b>PCDATA </b>, а затем разделенный символом <b>"|" </b> список элементов. </p> <p>Пример корректного <b>XML </b>- документа: </p> <span><?xml version="1.0"?> <! DOCTYPE journal [ <!ELEMENT contacts (address, tel+, email?)> <!ELEMENT address (street, appt)> <!ELEMENT street PCDATA> <!ELEMENT appt (PCDATA | EMPTY)*> <!ELEMENT tel PCDATA> <!ELEMENT email PCDATA> ]> ... <contacts> <address> <street>Marks avenue</street> <appt id="4"> </address> <tel>12-12-12</tel> <tel>46-23-62</tel> <email>info@j.com</email> </contacts> </span> <h4><span><b>Определение атрибутов </b> </span></h4> <p>Списки атрибутов элемента определяются с помощью ключевого слова!<b>ATTLIST </b>. Внутри него задаются названия атрибутов, типы их значений и дополнительные параметры. Например, для элемента </span><article> <span>могут быть определены следующие атрибуты: </p> <span><!ATTLIST article id ID #REQUIRED about CDATA #IMPLIED type (actual | review | teach) "actual" "" > </span> <p>В данном примере для элемента <b>article </b>определяются три атрибута: <b>id, </b><i> </i><b>about </b>и <b>type </b>,которые имеют типы <b>ID </b>(идентификатор), <b>CDATA </b> и список возможных значений соответственно. Всего существует шесть <a href="/tipy-sensornyh-ekranov-vozmozhnye-varianty-raboty-draivera-i-upravleniya/">возможных типов</a> значений атрибута: </p> <ul><li><span><b>CDATA </b> - содержимым документа могут быть любые символьные данные </span></li> <li><span><b>ID </b> - определяет уникальный идентификатор элемента в документе </span></li> <li><span><b>IDREF </b>(<b>IDREFS </b>)- указывает, что значением атрибута должно выступать название(или несколько таких названий, разделенных пробелами во втором случае) уникального идентификатора определенного в этом документе элемента </span></li> <li><span><b>ENTITY </b>(<b>ENTITIES </b>) - значение атрибута должно быть названием(или списком названий, если используется <b>ENTITIES </b>) компонента (макроопределения), определенного в документе </span></li> <li><span><b>NMTOKEN </b> (<b>NMTOKENS </b>) - содержимым элемента может быть только одно отдельное слово(т.е. этот параметр является ограниченным вариантом <b>CDATA </b>) </span></li> <li><span>Список допустимых значений - определяется список значений, которые может иметь данный атрибут. </span></li> </ul><p>Также в определении атрибута можно использовать <a href="/kakoi-router-vybrat-dlya-interneta-kakie-parametry-ne-sleduet/">следующие параметры</a>: </p> <ul><li><span><b>#REQUIRED </b> - определяет обязательный атрибут, который должен быть задан во всех элементах данного типа </span></li> <li><span><b>#IMPLIED </b> - атрибут не является обязательным </span></li> <li><span><b>#FIXED </b> "значение" - указывает, что атрибут должен иметь только <a href="/znachenie-otpravit-kopiyu-na-ukazannyi-e-mail-elektronnaya-perepiska-kak/">указанное значение</a>, однако само определение атрибута не является обязательным, но в процессе разбора его значение в любом случае будет передано программе-анализатору </span></li> <li><span>Значение - задает значение атрибута по умолчанию </span></li> </ul><h4><span><b>Определение компонентов(макроопределений) </b> </span></h4> <p>Компонент <b>(entity) </b>представляет собой определения, содержимое которых может быть повторно использовано в документе. В других языках программирования подобные элементы называются макроопределениями. Создаются <b>DTD </b>- компоненты при помощи инструкции <b>!ENTITY </b>: </p> <span><!ENTITY hello " Мы рады приветствовать Вас!" > </span> <p>Программа-анализатор, просматривая в первую очередь содержимое области <b>DTD </b>- определений, обработает эту инструкцию и при дальнейшем разборе документа будет использовать содержимое <b>DTD </b>- компонента в том месте, где будет встречаться его название. Т.е. теперь в документе мы можем использовать выражение <b>&hello </b>; , которое будет заменено на строчку <i>" </i><b>Мы рады приветствовать Вас" </b> </p> <p>В общем случае, внутри <b>DTD </b> можно задать три типа макроопределений: </p> <p><b>Внутренние макроопределения </b> </span><span>- предназначены для определения строковой константы, с их помощью можно организовывать ссылки на часто изменяемую информацию, делая документ более читабельным. Внутренние компоненты включаются в документ при помощи амперсанта <b>& </b> </p> <p>В <b>XML </b> существует пять предустановленных внутренних символьных констант: </p> <ul><li><span><b>< </b> - символ <b>"<" </b> </span></li> <li><span><b>> </b>- символ <b>">" </b> </span></li> <li><span><b>& </b> - символ <b>"&" </b> </span></li> <li><span><b>" </b>- символ апострофа<b> """ </b> </span></li> <li><span><b>" </b>- символ двойной кавычки <b>""" </b> </span></li> </ul><p><b>Внешние макроопределения </b> </span><span>- указывают на содержимое <a href="/net-yavlyaetsya-vnutrennei-ili-vneshnei-komandoi-imya-faila-ne-yavlyaetsya/">внешнего файла</a>, причем этим содержимым могут быть как текстовые, так и двоичные данные. В первом случае в месте использования макроса будут вставлены текстовые строки, во втором - бинарные данные, которые анализатором не рассматриваются и используются внешними программами </p> <span><!ENTITY logotype SYSTEM "/image.gif" NDATA GIF87A> </span> <p><b>Макроопределения правил </b> </span><span>- макроопределения параметров могут использоваться только внутри области DTD и обозначаются специальным символом <b>% </b>, вставляемым перед названием макроса. При этом содержимое компонента будет помещено непосредственно в текст <b>DTD </b>- правила </p> <p>Например, для следующего фрагмента документа: </p> <span><!ELEMENT name (PCDATA)> <!ELEMENT title (PCDATA | name)*> <!ELEMENT author (PCDATA | name)*> <!ELEMENT article (title, author)*> <!ELEMENT book (title, author)*> <!ELEMENT bookstore (book | article)*> <!ELEMENT bookshelf (book | article)*> </span> <p>можно использовать более короткую форму записи: </p> <span><!ELEMENT name (PCDATA)> <! ENTITY %names "PCDATA | name"> <!ELEMENT article (%names;)*> <!ELEMENT book (%names;)*> <!ENTITY %content "book | article"> <!ELEMENT bookstore (%content;)*> <!ELEMENT bookshelf (%content;)*> </span> <p>Макроопределения часто используются для описания параметров в правилах атрибутов. В этом случае появляется возможность использовать <a href="/opredelenie-odinakovyh-failov-na-kompyutere-poisk-i-udalenie-dublikatov/">одинаковые определения</a> атрибутов для различных элементов: </p> <span><!ENTITY %itemattr "id ID #IMPLIED src CDATA"> <!ENTITY %bookattr "ISDN ID #IMPLIED type CDATA"> <!ENTITY %artattr " size CDATA"> <!ELEMENT book (title, author,content)*> <!ATTLIST book %itemattr %bookattr;> <!ELEMENT article (title, author, content)*> <!ATTLIST article %itemattr %artattr;> </span> <h4><span><b>Типизация данных </b> </span></h4> <p>Довольно часто при создании <b>XML </b>- элемента разработчику требуется определить, данные какого типа могут использоваться в качестве его содержимого. Т.е. если мы определяем элемент </span><span><last-modified>10.10.98</last-modified> </span><span>, то хотим быть уверенными, что в документе в этом месте будет находиться строка, представляющая собой дату, а не число или произвольную последовательность символов. Используя типизацию данных, можно создавать элементы, значения которых могут использоваться, например, в качестве параметров <b>SQL </b>- запросов. Программа клиент в этом случае должна знать, к какому типу данных относится текущее значение элемента и в случае соответствия формирует <b>SQL </b>-запрос. </p> <p>Если в качестве программы на стороне клиента используется верифицирующий <b>XML </b>-процессор, то информацию о типе можно передавать при помощи специально созданного для этого <a href="/atributy-input-html-gruppirovka-elementov-formy-atributy-tega/">атрибута элемента</a>, имеющего соответствующее <b>DTD </b>- определение. В процессе разбора программа-анализатор передаст значение этого атрибута клиентскому приложению, которое сможет использовать эту информацию должным образом. Например, чтобы указать, что содержимое элемента должно быть длинным целым, можно использовать следующее <b>DTD </b>- определение: </p> <span><!ELEMENT counter (PCDATA)> <!ATTLIST counter data_long CDATA #FIXED "LONG"> </span> <p>Задав атрибуту значение по умолчанию <b>LONG </b> и определив его как <b>FIXED </b>, мы позволили тем самым программе-клиенту получить необходимую информацию о типе содержимого данного элемента, и теперь она может самостоятельно определить соответствие типа этого содержимого указанному в <b>DTD </b>- определении. </p> <p>Вот пример <b>XML </b>- документа, в котором определяются и используются несколько элементов с различными типами данных: </p> <span><!ELEMENT price (PCDATA)> <!ATTLIST price data_currency CDATA #FIXED "CURRENCY"> <!ELEMENT rooms_num (PCDATA)> <!ATTLIST rooms_num data_byte CDATA #FIXED "BYTE"> <!ELEMENT floor (PCDATA)> <!ATTLIST floor data_byte CDATA #FIXED "INTEGER"> <!ELEMENT living_space (PCDATA)> <!ATTLIST living_space data_float CDATA #FIXED "FLOAT"> <!ELEMENT counter (PCDATA)> <!ATTLIST counter data_long CDATA #FIXED "LONG"> <!ELEMENT is_tel (PCDATA)> <!ATTLIST is_tel data_bool CDATA #FIXED "BOOL"> <!ELEMENT house (rooms_num, floor,living_space, is_tel, counter, price)> <!ATTLIST house id ID #REQUIED> ... <house id="0"> <rooms_num>5</rooms_num> <floor>2</floor> <living_space>32.5</living_space> <is_tel>true</is_tel> <counter>18346</counter> <price>34 р. 28 к.</price> </house> ... </span> <p>Как видно из примера, механизм создания элементов документа при этом нисколько не изменился. Все необходимая для проверки типов данных информация заложена в определения элементов внутри блока <b>DTD </b>. </p> <p>В заключении хотелось бы отметить, что <b>DTD </b> предоставляет нам весьма удобный механизм осуществления контроля за содержимым документа. На сегодняшний день, практически все программы просмотра документов Интернет используют <b>DTD </b>-правила. Однако это далеко не <a href="/kak-uznat-kakaya-u-tebya-versiya-androida-podrobno-o-tom-kak-uznat-versiyu/">единственный способ</a> проверки корректности документа. В настоящий момент в <b>W3 </b> консорциуме находится на рассмотрении новый стандарт языка описания <a href="/kak-sozdat-stil-zagolovka-pervogo-urovnya-podgotavlivaem/">структуры документов</a>, называемый схемами данных. Следующий раздел посвящен работе с ними. </p></td> <p>Это очередная статья в цикле «<a href="/kak-dobavit-v-xml-fail-guide-osnovy-xml-dlya-nachinayushchih/">Основы XML</a>» и в ней мы рассмотрим основы описания <a href="/osnovy-xml-razmetka-i-struktura-xml-dokumentov-pervye/">структуры XML</a> данных при помощи DTD. Это довольно таки <a href="/novoe-oformlenie-vkontakte-kak-ubrat-newdesignvk-ili-kak-vernut/">старый способ</a> описания структуры XML-документов, но он до сих пор используется, поэтому мы его все же рассмотрим.</p> <p>Также хочу отметить, что это <a href="/moya-strana-kod-podklyucheniya-usluga-moya-strana-ot-bilain/">отличный способ</a> показать, как в XML <a href="/plei-market-idet-proverka-chto-delat-pochemu-ne-poluchaetsya-zaiti-v-play-market/">идет проверка</a> содержимого документа, его грамматики и т.д. Более новый и <a href="/kak-zaryadit-aifon-bez-zaryadki-v-domashnih-usloviyah-kak-zaryadit-iphone/">совершенный способ</a> описания структуры XML-документов с использованием технологии XML Schema мы рассмотрим в следующей статье, ну а пока перейдем непосредственно к изучению DTD XML.</p> <p>В рамках данной статьи мы рассмотрим сразу несколько <a href="/kak-vosstanovit-udalennye-soobshcheniya-tele2-kak-na-telefone-vosstanovit-sms/">важных моментов</a>. Это что такое XML DTD и для чего он нужен, поговорим о недостатках DTD, а также научимся самостоятельно составлять собственный DTD для валидации XML-документов. Все это, как обычно, будет изложено пошагово, максимально кратко и понятно с целью экономии вашего времени.</p> <p>Итак, начнем.</p> <h2>Что такое DTD в XML и для чего он нужен</h2> <p>Если говорить кратко, то DTD в XML используется для проверки грамматики документа и соответствия его стандарту (тому, который придумал разработчик или вы сами). Это позволяет парсеру (обработчику) на этапе обработки определить, соответствует ли документ нашим требованиям. То есть, проходит валидация XML-документа.</p> <p>Необходимость проверки грамматики XML-документов заключается в следующем:</p> <ul><li>XML-документ может быть предназначен не для вашей системы.</li> <li>XML-документ может содержать неправильные данные.</li> <li>XML-документ может содержать ошибки в структуре ().</li> </ul><p>Итак, мы разобрались с тем, что такое XML DTD и зачем он нужен. Теперь давайте кратко рассмотрим недостатки DTD, после чего перейдем непосредственно к рассмотрению процесса создания DTD файлов для валидации XML-документов.</p> <h3>Недостатки XML DTD</h3> <ul><li>Отличный от <a href="/sintaksis-xml-opisanie-dlya-chainikov-v-zhizni-vse-ne-tak-kak/">XML синтаксис</a> языка. Это вызывает множество проблем, таких как, например, проблемы с кодировкой или невозможность отслеживать ошибки.</li> <li>Нет проверки типов данных. В DTD есть только один тип – строка.</li> <li>В DTD нет . Нельзя поставить в соответствие документу два и более DTD описаний.</li> </ul><p>Это был <a href="/chto-takoe-programma-v-kakie-byvayut-kompyuternye-programmy-spisok/">краткий список</a> недостатков DTD, которые с успехом исправлены в <a href="/chto-takoe-dtd-na-angliiskom-osnovy-ispolzovaniya-xml-shem-dlya-opredeleniya/">XML схемах</a>, о которых мы поговорим в следующих статьях.</p> <h4>Объявление элементов, атрибутов и сущностей в DTD. Модификаторы «*», «?», «+»</h4> <p>Для объявления элементов, атрибутов и сущностей в DTD используются специальные декларации и модификаторы. Чтобы подробно во всем разобраться, давайте для начала рассмотрим теоритическую информацию, а затем во второй части статьи перейдем к практическим примерам.</p> <p><b>Определение элемента XML и последовательности элементов XML </b></p> <p> <!ELEMENT название элемента (что может содержать)></p> <p> <!ELEMENT book (title, author, price, description)></p> <p>Элемент book содержит по одному элементу title, author, price и description.</p> <p><b>Альтернативы элементов </b></p> <p> <!ELEMENT название элемента (элемент 1, элемент 2, (элемент 3 | элемент 4 | элемент 5))></p> <p> <!ELEMENT pricelist (title, price, (author | company | sample))></p> <p>Элемент pricelist содержит элементы title, price и один элемент из трех на выбор – author, company либо sample.</p> <p><b>Пустые элементы </b></p> <p> <!ELEMENT элемент EMPTY></p> <p> <!ELEMENT none EMPTY></p> <p>Элемент none должен быть пустым.</p> <p><b>Объявление атрибута </b></p> <p> <!ATTLIST элемент атрибут 1 CDATA #REQUIRED атрибут 2 CDATA #IMPLIED ></p> <p> <!ATTLIST pricelist id CDATA #REQUIRED name CDATA #IMPLIED ></p> <p>Элемент pricelist может содержать два атрибута – атрибут id и <a href="/znachenie-atributa-name-raznica-mezhdu-atributami-id-i-name-v-html-atributy/">атрибут name</a>. При этом атрибут id является обязательным, так как указано #REQUIRED, а атрибут name – не обязательным (указано #IMPLIED). В свою очередь CDATA указывает обработчику, что разбирать содержимое атрибутов не нужно.</p> <p><b>Определение сущностей </b></p> <p> <!ENTITY сущность "что подставлять"></p> <p> <!ENTITY myname "Дмитрий Денисов"></p> <p>Если встретится сущность «&myname;», то вместо нее автоматически подставится «Дмитрий Денисов».</p> <p><b>Модификаторы (объясняют повторения элементов) </b></p> <p>* — ноль или много.<br> ? – ноль или один.<br> + — один или много.</p> <p> <!ELEMENT books (book+)></p> <p>Элемент books может содержать один или более элементов book.</p> <p>Теперь давайте рассмотрим, как это все выглядит на более практических примерах.</p> <h5>Создание DTD-файла для валидации XML-документа на примере прайс-листа книг</h5> <p>Пусть у нас будет все тот же прайс-лист книг, который мы используем для примеров практически в каждой статье про XML. Сам XML-документ будет выглядеть примерно следующим образом.</p> <p> <?xml version="1.0" encoding="utf-8"?> <pricelist> <book> <title>Книга 1 &myname; Цена 1 Описание

Конечно, вышеприведенный пример не является пределом мечтаний, но для примера вполне сойдет. Как видно с примера, у нас есть корневой элемент pricelist, который содержит вложенные элементы book. Внутри элементов book находятся элементы title, author, price и возможно description, которые могут содержать какие-то текстовые данные.

Для валидации данного прайс-листа мы можем использовать DTD-документ следующего содержания.

Теперь разберем все более подробно.

  • — декларируем корневой элемент books и в скобках указываем, что он может содержать. В данном случае он может содержать один или более элементов book (плюсик означает один или более, см. выше).
  • — определяем элемент book. Элемент book может содержать один элемент title, один или более элементов author (плюсик), один элемент price и один или ни одного элемента description (знак вопроса).
  • — определяем элемент title. В качестве содержимого элемента указываем #PCDATA. Это означает, что анализатор обязан разбирать то, что находится внутри этого элемента.
  • Аналогичным образом определяем элементы author, price, description.
  • — определяем сущность. Сначала пишем саму сущность, а затем в кавычках то, что будет выводиться на ее месте. По умолчанию в XML определено только 3 сущности. Это больше («>» — <), меньше («<» — >) и амперсанд («&» — &). При желании вы можете создать неограниченное количество сущностей, используя данный способ. В качестве значений могут быть не только слова, но и целые предложения значительного объема.
Подключение DTD для валидации XML-документов

Декларативный способ

Данный способ очень редко используется, так как его суть состоит в создании самодостаточных документов. То есть, документ будет сразу содержать и DTD и XML. Для добавления DTD в XML используется следующая конструкция.

где вместо DOCUMENT указываем корневой элемент XML-документа.

Для наглядности рассмотрим пример готового самодостаточного документа с декларативным способом включения DTD.

]>

Внешнее определение DTD — подключение DTD-документа

Суть данного метода состоит в том, чтобы подключить к XML-документу файл DTD при помощи следующей конструкции.

где DOCUMENT – указываем корневой элемент XML-документа.
file.dtd – ссылка на файл DTD.

Для наглядности рассмотрим следующий пример.

XML-документ

На этом данная статья подошла к концу. Все основные моменты при работе с XML DTD мы рассмотрели и, надеюсь, у меня получилось понятно все объяснить. Если вы не хотите пропустить выпуска других уроков по XML и XSLT, рекомендую подписаться на новостную рассылку, воспользовавшись формой ниже.

На этом все. Удачи вам и успехов в изучении XML!



Рекомендуем почитать

Наверх