Xml dtd примеры. Определение типа документа (DTD). Использование пространств имен в XML-схеме

Для Андроид 27.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>Текст тоже равноправный участник игры. Ключевое слово « 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). Такой элемент задается с <a href="/podbor-klyuchevyh-slov-ot-a-do-ya-kakiie-klyuchevye-slova-ot-otdelnyh/">ключевым словом</a> « 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, атрибуты могут иметь следующие типы:</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> <p>Определение типов документа (DTD) декларирует допустимые строительные блоки <a href="/otkryt-dokument-hml-onlain-kak-otkryt-xml-dokument-osobennosti-raboty-s/">XML документа</a>. Оно задает структуру документа со списком <a href="/izmenenie-razmerov-elementov-na-jquery-masshtabirovanie-elementov/">допустимых элементов</a> и атрибутов.</p> <p>DTD может декларироваться как в коде самого XML документа, так и во <a href="/net-yavlyaetsya-vnutrennei-ili-vneshnei-komandoi-imya-faila-ne-yavlyaetsya/">внешнем файле</a> с подключением его к XML документу.</p> <h3>Внутренняя декларация DTD</h3> <p>Если DTD декларируется внутри <a href="/programma-dlya-otkrytiya-i-redaktirovaniya-xml-failov-chto-takoe-fail-xml/">XML файл</a>а, то она должны быть заключена в специальный тег декларации <b>DOCTYPE </b>, который имеет следующий синтаксис:</p><p> <!DOCTYPE корневой-элемент [декларации-элементов]> </p><p>Пример XML документа с внутренним DTD:</p><p> <?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Напоминание</heading> <body>Не забудь обо мне в эти выходные</body> </note> </p><p>DTD в приведенном примере интерпретируется следующим образом:</p> <ul><li><i><b>!DOCTYPE note </b> </i> определяет, что корневым элементом документа является <b>note </b></li> <li><i><b>!ELEMENT note </b> </i> определяет, что элемент <b>note </b> содержит четыре элемента: <b>to, from, heading, body </b></li> <li><i><b>!ELEMENT to </b> </i> определяет, что элемент <b>to </b> должен быть </li> <li><i><b>!ELEMENT from </b> </i> определяет, что элемент <b>from </b> должен быть типа "#PCDATA"</li> <li><i><b>!ELEMENT heading </b> </i> определяет, что элемент <b>heading </b> должен быть типа "#PCDATA"</li> <li><i><b>!ELEMENT body </b> </i> определяет, что элемент <b>body </b> должен быть типа "#PCDATA"</li> </ul><h3>Внешняя декларация DTD</h3> <p>Если DTD декларируется во внешнем файле, то подключение осуществляется следующим образом:</p><p> <!DOCTYPE корневой-элемент SYSTEM "имя файла"> </p><p>Ниже приводится тот же XML документ, что и ранее, но с внешней декларацией DTD:</p><p> <?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>Tove</to> <from>Jani</from> <heading>Напоминание</heading> <body>Не забудь обо мне в выходные</body> </note> </p><p>А вот что содержится в файле "note.dtd", который декларирует DTD:</p><p> <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> </p><h3>Для чего используют DTD?</h3> <p>С DTD каждый ваш XML файл может нести описание своего собственного формата.</p> <p>С DTD различные, не связанные друг с другом, группы людей могут приходить к соглашению о стандартах взаимно обмениваемых данных.</p> <p>С DTD вы можете быть уверены, что получаемые из <a href="/oshibki-v-rabote-play-market-i-ih-reshenie-video-tipovye-puti-resheniya/">внешних источников</a> данные будут корректными.</p> <p>Также, вы можете использовать DTD, чтобы проводит проверки корректности своих собственных данных.</p> <p>Это очередная статья в цикле «<a href="/kak-dobavit-v-xml-fail-guide-osnovy-xml-dlya-nachinayushchih/">Основы XML</a>» и в ней мы рассмотрим основы описания структуры <a href="/kak-pisat-xml-fail-sozdanie-faila-xml-dannyh-i-faila-shemy-xml-iz-dannyh-lista/">XML данных</a> при помощи DTD. Это довольно таки <a href="/novoe-oformlenie-vkontakte-kak-ubrat-newdesignvk-ili-kak-vernut/">старый способ</a> описания <a href="/osnovy-xml-razmetka-i-struktura-xml-dokumentov-pervye/">структуры XML</a>-документов, но он до сих пор используется, поэтому мы его все же рассмотрим.</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-документов с использованием технологии <a href="/xml-schema-xml-shema-opisanie-struktury-xml-dokumentov-chem-otkryt-xsd-chto-xsd-shema/">XML Schema</a> мы рассмотрим в следующей статье, ну а пока перейдем непосредственно к изучению 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, которые с успехом исправлены в XML схемах, о которых мы поговорим в следующих статьях.</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!



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

Наверх