Вредоносное ПО (malware) - это назойливые или опасные программы,...
Как раз таковыми и являются. Причём 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) декларирует допустимые строительные блоки XML документа. Оно задает структуру документа со списком допустимых элементов и атрибутов.
DTD может декларироваться как в коде самого XML документа, так и во внешнем файле с подключением его к XML документу.
Внутренняя декларация DTD
Если DTD декларируется внутри XML файла, то она должны быть заключена в специальный тег декларации DOCTYPE , который имеет следующий синтаксис:
Пример XML документа с внутренним DTD:
]>
DTD в приведенном примере интерпретируется следующим образом:
- !DOCTYPE note определяет, что корневым элементом документа является note
- !ELEMENT note определяет, что элемент note содержит четыре элемента: to, from, heading, body
- !ELEMENT to определяет, что элемент to должен быть
- !ELEMENT from определяет, что элемент from должен быть типа "#PCDATA"
- !ELEMENT heading определяет, что элемент heading должен быть типа "#PCDATA"
- !ELEMENT body определяет, что элемент body должен быть типа "#PCDATA"
Внешняя декларация DTD
Если DTD декларируется во внешнем файле, то подключение осуществляется следующим образом:
Ниже приводится тот же XML документ, что и ранее, но с внешней декларацией DTD:
А вот что содержится в файле "note.dtd", который декларирует DTD:
Для чего используют DTD?
С DTD каждый ваш XML файл может нести описание своего собственного формата.
С DTD различные, не связанные друг с другом, группы людей могут приходить к соглашению о стандартах взаимно обмениваемых данных.
С DTD вы можете быть уверены, что получаемые из внешних источников данные будут корректными.
Также, вы можете использовать DTD, чтобы проводит проверки корректности своих собственных данных.
Это очередная статья в цикле «Основы XML» и в ней мы рассмотрим основы описания структуры XML данных при помощи DTD. Это довольно таки старый способ описания структуры XML-документов, но он до сих пор используется, поэтому мы его все же рассмотрим.
Также хочу отметить, что это отличный способ показать, как в XML идет проверка содержимого документа, его грамматики и т.д. Более новый и совершенный способ описания структуры XML-документов с использованием технологии XML Schema мы рассмотрим в следующей статье, ну а пока перейдем непосредственно к изучению DTD XML.
В рамках данной статьи мы рассмотрим сразу несколько важных моментов. Это что такое XML DTD и для чего он нужен, поговорим о недостатках DTD, а также научимся самостоятельно составлять собственный DTD для валидации XML-документов. Все это, как обычно, будет изложено пошагово, максимально кратко и понятно с целью экономии вашего времени.
Итак, начнем.
Что такое DTD в XML и для чего он нужен
Если говорить кратко, то DTD в XML используется для проверки грамматики документа и соответствия его стандарту (тому, который придумал разработчик или вы сами). Это позволяет парсеру (обработчику) на этапе обработки определить, соответствует ли документ нашим требованиям. То есть, проходит валидация XML-документа.
Необходимость проверки грамматики XML-документов заключается в следующем:
- XML-документ может быть предназначен не для вашей системы.
- XML-документ может содержать неправильные данные.
- XML-документ может содержать ошибки в структуре ().
Итак, мы разобрались с тем, что такое XML DTD и зачем он нужен. Теперь давайте кратко рассмотрим недостатки DTD, после чего перейдем непосредственно к рассмотрению процесса создания DTD файлов для валидации XML-документов.
Недостатки XML DTD
- Отличный от XML синтаксис языка. Это вызывает множество проблем, таких как, например, проблемы с кодировкой или невозможность отслеживать ошибки.
- Нет проверки типов данных. В DTD есть только один тип – строка.
- В DTD нет . Нельзя поставить в соответствие документу два и более DTD описаний.
Это был краткий список недостатков DTD, которые с успехом исправлены в XML схемах, о которых мы поговорим в следующих статьях.
Объявление элементов, атрибутов и сущностей в DTD. Модификаторы «*», «?», «+»
Для объявления элементов, атрибутов и сущностей в DTD используются специальные декларации и модификаторы. Чтобы подробно во всем разобраться, давайте для начала рассмотрим теоритическую информацию, а затем во второй части статьи перейдем к практическим примерам.
Определение элемента XML и последовательности элементов XML
Элемент book содержит по одному элементу title, author, price и description.
Альтернативы элементов
Элемент pricelist содержит элементы title, price и один элемент из трех на выбор – author, company либо sample.
Пустые элементы
Элемент none должен быть пустым.
Объявление атрибута
Элемент pricelist может содержать два атрибута – атрибут id и атрибут name. При этом атрибут id является обязательным, так как указано #REQUIRED, а атрибут name – не обязательным (указано #IMPLIED). В свою очередь CDATA указывает обработчику, что разбирать содержимое атрибутов не нужно.
Определение сущностей
Если встретится сущность «&myname;», то вместо нее автоматически подставится «Дмитрий Денисов».
Модификаторы (объясняют повторения элементов)
* — ноль или много.
? – ноль или один.
+ — один или много.
Элемент books может содержать один или более элементов book.
Теперь давайте рассмотрим, как это все выглядит на более практических примерах.
Создание DTD-файла для валидации XML-документа на примере прайс-листа книг
Пусть у нас будет все тот же прайс-лист книг, который мы используем для примеров практически в каждой статье про XML. Сам XML-документ будет выглядеть примерно следующим образом.
Конечно, вышеприведенный пример не является пределом мечтаний, но для примера вполне сойдет. Как видно с примера, у нас есть корневой элемент 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!