XML technologies: XML, DTD, XML Schema |
В данном руководстве рассматриваются различные XML-технологии, такие как:
XML, DTD, XMLSchema на простых примерах.
Дата создания: 02.03.07. |
Cодержание
1 Краткое описание технологии XMLXML – это технология, предназначенная для представления текстовых данных в высокоструктурированном виде, пригодном для программной обработки. XML-документы представляют собой систему элементов. Каждый элемент имеет имя и оформляется парой из открывающего и закрывающего тэгов. Набор элементов и правил их вложения не фиксирован. В теле элемента может быть расположен текст, вложенные элементы. Тело элемента может быть пустым. В этом случае элемент можно записывать двумя разными способами: или так: У элемента могут быть атрибуты, содержащие некоторую информацию об элементе. Значение атрибута указывается после знака "=" в двойных кавычках или апострофах. При этом недопустимо отсутствие закрывающего тэга у элемента, указание атрибута без кавычек и пересечение тел элементов. Определиться, где хранить информацию, связанную с элементом ( во вложенных элементах или атрибутах), просто: если информация простая, т.е. ее можно представить в виде строки или числа, то ее можно указать атрибутом (например цвет, год выпуска автомобиля). Эту информацию конечно можно указать и в виде вложенного в элемент "автомобиль" элемента "цвет" или "дата выпуска", но в данном случае логичнее будет указать ее в атрибутах, исходя из предметной области, т.к. цвет и дата выпуска не вложены физически в автомобиль, это просто дополнительная информация о нем. А вот в качестве вложенных элементов автомобиля можно указать например двигатель (с другими вложенными элементами) и т.п. У XML-документа может быть только один корневой элемент. Таким образом XML-документ представляет собой дерево элементов с атрибутами. Кроме элементов спецификация XML определяет еще несколько конструкций, которые могут использоваться при формировании XML-документа:
которые совместно с открывающими тэгами (start tags), закрывающими тэгами (end tags) формируют разметку (mark up), которая позволяет представить текст в высокоструктурированном виде. В формировании разметки также участвуют тэги пустых элементов (empty-elements tags). XML-документы, удовлетворяющие общим требованиям спецификации XML, называются well-formed. Если документы удовлетворяют еще и заданным спецификацией средствами ограничений, определяемыми предметной областью, то он называется valid. Для описания ограничений на содержание XML-документа в соответствии с ограничениями предметной области существует ряд технологий:
Рассмотрим различные виды разметки: 1.1 КомментарииПредназначен для внедрения в XML-документ информации, которая не считается частью данных, переданных в составе XML-документа. XML-анализатор может включать, а может и не включать комментарии в результате анализа – это зависит от анализатора. В тексте комментария нельзя использовать --. 1.2 Инструкции обработкиИмя_инструкции должно отличаться от имени XML в любом сочетании регистра символов. Данные – необязательно, но если есть – нельзя использовать ?>. Инструкции обработки внедряются в XML-документ для того, чтобы сообщить прикладной программе дополнительные сведения о том, как обрабатывать XML-документ. XML-анализатор обязан включать все инструкции обработки в результате анализа. 1.3 Секции CDATAПри этом текст не должен содержать ]]>. Секции CDATA используются для оформления фрагментов текста, которые содержат множество символов, запрещенных спецификацией для употребления в литеральной форме в составе текста. Внутри секции CDATA они могут быть в литеральной форме. Спецификация XML запрещает использовать символы & и < в их литеральной форме везде, кроме разделителей разметки (ссылки на сущности и символы, а также тэги) или внутри комментариев, инструкций обработки и секции CDATA. Во всех остальных случаях эти символы должны заменяться на встроенные esc-последовательности. Например, в теле элемента или в значении атрибута. 1.4 Ссылки на сущности и символыСсылки на сущности и символы используются для замены фрагментов текста или одного символа соответствующей esc-последовательностью. Ссылки на символы оформляются так: &#десятичный код; либо &#xшестнадцатеричный код;. Указанный десятичный или шестнадцатеричный код ссылается на UNICODE-символ. Ссылки на сущности оформляются по-разному, в зависимости от того, где они используются. Если ссылка на сущность используется внутри XML-документа, но за пределами DTD, то: &имя сущности;. Если используется в составе DTD-описания, то: %имя сущности;. В любом случае имя сущности должно быть определено в составе DTD-описания и оно не должно быть рекурсивным. В результате анализа XML-анализатор заменяет вхождения ссылки на соответствующий символ или текст. 1.5 XML-объявления и текстовые объявленияXML-объявления, текстовые объявления указывают, что документ является XML-документом, а не каким-то другим. При этом XML-объявление не обязательно. Текстовые объявления указывается в тех XML-документах, которые включаются по ссылке в другие XML-документы. Например, XML-объявление указывается в тех документах, которые не включены в другие XML-документы. XML-объявления и текстовые объявления в общем случае выглядят одинаково: Здесь, в XML-объявлении, предложение encoding – необязательно, а version – обязательно. В текстовом объявлении оба предложения - необязательны. Если не указана кодировка, используется utf-8 (UNICODE). Если не указывается версия, то используется 1.0. 1.6 DTD (Document Type Declaration)Ограничения на структуру XML-документов, специфичные для той или иной предметной области, могут быть описаны формально одним из двух способов: DTD или W3C XMLSchema. Язык DTD определен в составе спецификации XML, является простым языком с довольно ограниченными возможностями. XMLSchema описывается на XML-языках, которые определяются отдельными спецификациями. Комитетом W3C в качестве международного стандарта был утвержден язык описания XMLSchema. DTD-описания могут включаться непосредственно в состав XML-документа, а могут оформляться в отдельном файле. В последнем случае в XML-документ может быть внедрена ссылка на DTD-описание. Допускается также одновременно внедрить ссылку на DTD и само DTD-описание. В этом случае непосредственное присутствие DTD-описания имеет приоритет над ссылкой. Для внедрения DTD-описания непосредственно или по ссылке используется document type declaration: по ссылке: непосредственно: по ссылке и непосредственно: 1.7 Обобщенная структура XML-документаВ общем, документ можно представить из последовательности трех частей: пролог, корневой элемент, разное. Пролог включает последовательно необязательное XML-объявление, комментарии и инструкции обработки. Среди них может присутствовать одно объявление типа документ. Корневой элемент содержит структурные данные и может содержать текст, вложенные элементы, комментарии, секции CDATA, инструкции обработки. После корневого элемента могут идти комментарии и инструкции обработки. Любые элементы разметки могут оформляться пробельным материалом (white space): пробел (%#x20;), табуляция (	), перевод каретки (
), возврат строки (
). XML-документы являются регистрозависимыми. Кроме того, весь пробельный материал, не являющийся частью разметки, сохраняется. Обработка символов конца строки ведется следующим образом: любая последовательная пара символов 
 
 а также 
 без 
 преобразуется в 
. 2 DTD2.1 Краткое описание языка DTDЯзык DTD (Document Type Declaration) представляет собой последовательность объявлений и ссылок на параметризованные сущности (parameter entity reference). Объявления могут содержать: объявления элементов, атрибутов, сущностей, нотаций, а также инструкции обработки и комментарии. Рассмотрим последовательно элементы языка DTD: Элементы
Спецификация тела может указывать, что:
элемент пустой (EMPTY), ограничение на тело отсутствует (ANY), либо задавать
некую модель тела. Модель задается с использованием конструкций последовательности и
выбора, с которыми можно использовать модификаторы повторения: ? – необязательное
присутствие элемента; + - элемент присутствует один или более раз последовательно;
* - элемент присутствует 0 или более раз последовательно.
Последовательность задается с помощью конструкции: АтрибутыСписок атрибутов для элемента можно описать так:
Список определений содержит разделенные пробелами конструкции вида:
Встроенные типы:
Перечислимые типы задают список возможных значений атрибута. Задаются одним из двух способов:
Ограничение: у элемента может быть не более одного атрибута типа NOTATION, а у элементов, объявленных как EMPTY, атрибутов типа NOTATION быть не может вовсе. Атрибуты типа NOTATION используются для связывания с элементами некоторого публичного или системного идентификатора, который может быть использован приложением для идентификации тела элемента. Умолчания описываются следующим образом:
Атрибут типа ID должен быть описан как #REQUIRED или #IMPLIED. Заданное значение по умолчанию должно соответствовать типу атрибута. Значение по умолчанию указывается в одинарных или двойных кавычках. Значения атрибутов в документе при анализе подвергаются процедуре нормализации, которая выполняется так:
Сущности и ссылки на нихСущности бывают двух типов: общие (general) и параметризованные (parameter). Сущности каждого вида делятся на внутренние (internal) и внешние (external). General external entities дополнительно делятся на анализируемые (parsed) и неанализируемые (unparsed). Различия между общими и параметризованными сущностями заключаются в том, что ссылка на общую сущность может присутствовать в XML-документе и в DTD, а ссылка на параметризованную сущность – внутри DTD-описания. Для внутренних сущностей замещающий текст указывается непосредственно при описании сущности. Для внешних - указывается ссылка на ресурс, который содержит замещающий текст. Различия между parsed и unparsed:
Общие сущности:
Спецификация сущности может задаваться значением сущности в одинарных или двойных кавычках,
может содержать ссылки на символы, а также общие и параметризованные сущности.
Спецификация может указывать ссылку на ресурс:
Публичный идентификатор – некий идентификатор, который принято составлять следующим образом:
После ссылки может идти указание нотации в виде NDATA – имя нотации. Если указание нотации присутствует, то эта сущность general external unparsed, иначе general external parsed. При этом используемое здесь имя нотации должно быть объявлено. Если значение сущности указано при объявлении, то она general external. Параметризованные сущности: Описание параметризованных сущностей выполняется также, как и общих, но с двумя отличиями:
Замечание: ссылка на DTD в document type declaration оформляется по тем же правилам, что и ссылка на значение внешней сущности. Ссылки на сущности используются с определенными ограничениями:
При использовании ссылок на сущность нужно следить за тем, чтобы после замещения их на соответствующим текстом, результирующий XML-документ оставался well formed. Нотации
Объявление нотаций вводит имена, которые могут использоваться при описании
общих внешних неанализируемых сущностей или тела элемента, содержащего атрибут типа NOTATION.
Обработка такого рода содержимого должна выполняться приложением.
Ссылка может содержать системный идентификатор:
2.2 Пример DTD-описанияЗдесь рассматривается пример DTD, описывающего предметную облать "Компьютерный магазин". Краткое описание данной предметной области: имеются две главные сущности - это проданный системный блок (chassis) и сотрудник (employee). При этом имеется информация о том, какой сотрудник продал данный системный блок. Корневым элементом документа является элемент shop. Элемент chassis имеет атрибуты: идентификатор (id), дату (dateofsale), цену продажи (price) и атрибут (whosold), указывающий идентификатор сотрудника, продавшего системный блок. У системного блока указана его конфигурация: корпус (case), материнская плата (motherboard), процессор (cpu), оперативная память (ram), жесткий диск (hdd), оптический привод (diskdrive) и видеокарта (videocard). В системном блоке должна быть только одна материнская плата, один процессор и одна память. В системном блоке может быть один и более жестких дисков (в XML-схеме количество ЖД и оптических приводов будет ограничено четырьмя штуками), оптических приводов может быть несколько, а может и не быть совсем, также не обязательна видеокарта (она может быть встроена в материнскую плату). Корпус системного блока имеет следующие атрибуты: цвет, тип и название. Также в нем должен быть указан дочерний элемент epu (блок питания), указывающим его мощность в ваттах, с атрибутом turbo. Материнская включает следующие элементы: название (title), модель (model) и тип чипсета (chipset), кроме того, она может содержать и обычный текст. Пустой элемент cpu имеет следующие атрибуты: модель, частота ядра и часта шины, связывающей процессор с ОЗУ. Элемент ОЗУ имеет только один атрибут – объем памяти (size). Жесткий диск имеет атрибуты модель и ёмкость. Оптический привод имеет атрибуты тип, модель и скорость. Видеокарта имеет атрибуты тип и модель. Кроме этого, в корневом элементе могут быть указаны контакты магазина (contactsShop) и изображение его логотипа (image). Контакты состоят из адреса, телефона, факса и адреса электронной почты, а также произвольного текста. Элемент image имеет атрибут src, указывающий ссылку на файл с изображением логотипа, и alt - текст. В корневом элементе также указывается элемент emplist, который содержит список сотрудников магазина (employee). У элемента employee указываются элементы: fio (ФИО), post (должность), age (возраст) и contactsEmployee (контакты сотрудника). Также у него есть атрибут - идентификатор.
DTD-описание выполнено в отдельном внешнем файле.
Документ-пример содержит ссылку на DTD-описание:
DTD-описание демонстрирует использование конструкций описания элементов с вложенными элементами
и применением следования, альтернативы, необязательности и повторяемости этих вложенных элементов:
DTD-описание демонстрирует использование конструкций описания атрибутов, как обязательных, так и необязательных, в том числе со значением по умолчанию для атрибутов следующих типов: ID, IDREF или IDREFS, CDATA, а также одного из перечисляемых типов: Параметризованная и обычная сущности, и ссылки на них в DTD-описании и документе-примере: Внешняя неанализируемая сущность в сочетании с описанием атрибута: Полный листинг DTD-описания: Полный листинг XML документа-примера, удовлетворяющего условиям DTD-описания: 3 XML Schema3.1 Пространство имен XMLXML-документы могут конструироваться из элементов и атрибутов, определенных в разных схемах или DTD. Например, в WSDL-описании web-сервисов в рамках одного документа используются конструкции, определенные схемами языков WSDL, W3C XML Schema и SOAP. Так как разработка схем может вестись независимо, то при совместном их использовании возникает опасность конфликта имен элементов и атрибутов. Для разрешения этой проблемы был придуман механизм пространств имен XML (XML namespaces). Суть этого механизма в том, что с каждой схемой сопоставляется некоторый глобально-уникальный идентификатор, задаваемый в формате uri. Этот uri служит только для идентификации пространства имен, а не для извлечения фактической схемы на этапе валидации XML-документа. Это означает, что идентификатор пространства имен может и не соответствовать никакому актуальному ресурсу в сети.
Идея заключается в том, что идентификатор пространства имен совместно с именем элемента или
атрибута из этого пространства имен образует глобально-уникальное имя, так как имена элементов
и атрибутов в пределах одного пространства имен уникальны. Чтобы избавить от необходимости
квалификации каждого элемента и атрибута сравнительно длинным uri, вместо них используют
короткий префикс, который вводится в XML-документ с помощью атрибутов,
которые имеют имя xmlns, либо префикс xmlns: и локальное имя.
Атрибуты с именем xmlns используются для объявления пространства имен
по умолчанию, а атрибуты с префиксом xmlns: используются для объявления префиксов,
занимающих в данном XML-документе соответствующий идентификатор пространства имен.
Сам префикс вводится локальным именем:
Введенные префиксы используются для квалификации элементов и атрибутов в виде:
Элементы без префиксов считаются относящимися к пространству имен по умолчанию. Атрибуты без префиксов считаются относящимися к тому пространству имен, к которому относится элемент, с которым они используются. Префиксы пространств имен и пространства имен по умолчанию можно вводить в любом элементе. При этом действие вводимых префиксов и умолчаний распространяется на все вложенные в данный элемент элементы и атрибуты, если только в них не было сделано переопределение. Пример: 3.2 Краткое описание XML SchemaЯзык схем – это XML-язык, предназначенный для описания структуры XML-документов. Сами описания, выполненные на языке схем, являются XML-документами. Элементы и атрибуты языка схем определены пространством имен http://www.w3.org/2001/XMLSchema. Существенное отличие языка схем от DTD то, что здесь введено понятие «тип»: элементы и атрибуты определяются тем или иным типом. Важно то, что типы могут быть описаны отдельно от элементов и атрибутов. Язык схем поддерживает богатые возможности для описания новых типов на базе встроенных, либо описанных на языке схем типов. Типы бывают простыми и сложными. Значения простого типа задаются строкой, не содержащей разметки. Значения сложного типа формируются из элементов и атрибутов. Атрибуты могут быть только простых типов, а элементы еще и сложных. Корневым элементом в языке схем является элемент schema, внутри которого описываются типы, элементы и атрибуты. Полностью описывать язык схем я не буду, приведу только пример с комментариями. Вы можете посмотреть спецификацию языка схем, если вам нужна полная информация по нему. Кроме этого вам также может понадобится изучить язык XPath и регулярные выражения. 3.3 Пример XML-схемыДанная XML-схема описывает ту же предметную область, что и пример DTD. Схеме сопоставлено пространство имен myns и при этом предусмотрена квалификация элементов, определенных схемой, в документе, построенном на ее основе (атрибут elementFormDefault со значением qualified): Документ-пример содержит ссылку на XML-схему: Схема демонстрирует использование конструкций для описания сложного типа, образованного вложенными элементами и атрибутами. Например, элемент epu вложен в элемент case, который, в свою очередь, вложен в элемент chassis. При описании сложных типов используются группы sequence, choice и all: Схема содержит описание абстрактного сложного типа и элемента этого типа, а пример документа использует его: Схема демонстрирует описание нового сложного типа на базе как простого типа, так и сложного. Как путем расширения, так и путем ограничения: В схеме используется возможность описания новых простых типов на базе существующих при помощи фасетов pattern (шаблон на языке регулярных выражений), enumeration и minInclusive/maxInclusive, а также списков и объединений: Схема содержит описание ограничения уникальности, ключа и ссылки на ключ (здесь используются конструкции языка XPath): Скачать полный исходный код XML-схемы. Пример XML-документа, построенного по схеме: В начало страницы |