XML-ТЕХНОЛОГИИ Лекция 2 Схемы XML-документа Ограничения на структуру документа XML предоставляет слишком большую свободу в организации корректного документа Такая свобода может стать источником ошибок и путаницы Решение — задать структурные и семантические ограничения Примеры ограничений на структуру документа Структурное ограничение: элемент с именем А может содержать только элементы с именем В Семантическое ограничение: атрибут a, содержащийся в элементе A, должен обладать уникальным значением среди множества значений атрибутов a Схемы XML-документов Схема XML-документа — модель, отделенная от самого документа, в которой заданы его структурные и параметрические ограничения Схема — модель типов Наиболее популярными языками являются DTD, XML Schema (XSD), RelaxNG, XDR Валидные XML-документы Валидный XML-документ по отношению к некоторой схеме — корректный XMLдокумент, удовлетворяющий всем ограничениям, определенным в схеме DTD. Аббревиатура и назначение DTD — Document Type Definition DTD — это язык описания, который позволяет определить, какие элементы должны быть в XML-документе, сколько раз они должны повторяться, какие атрибуты должны быть у этих элементов, какие атрибуты обязательные и какие не обязательные, а также какие сущности могут использоваться в документе DTD. Преимущества DTD является де-факто стандартом спецификации схем (по крайней мере, пока стандарт XML Schema не будет окончательно утвержден) схемы DTD можно однозначно отобразить на другие XML-схемы DTD. Объявление типа документа <!DOCTYPE корневой_элемент URI_внешнего_подмножества [внутреннее_подмножество]>: <!DOCTYPE root "schemas/test.dtd"> или <!DOCTYPE root [ <!ELEMENT root (elem1)+> ]> или <!DOCTYPE root "schemas/test.dtd" [ <!ELEMENT root (elem1)+> ]> DTD. Объявление элементов <!ELEMENT название элемента (что может содержать)> Специальные знаки: «+» — один или несколько экземпляров объекта в скобках «*» — ноль, один или несколько экземпляров объекта «?» — допустимы ноль или один экземпляр объекта DTD. Объявление элементов «EMPTY» — элемент должен быть пустым «ALL» — элемент может содержать любые вложенные элементы и текстовые узлы «#PCDATA» — элемент может содержать только текст, но не вложенные элементы DTD. Примеры объявления элементов <!ELEMENT снабжение (поставщик)+> <!ELEMENT поставщик (поставка)*> <!ELEMENT поставка (товар)> <!ELEMENT товар EMPTY> DTD. Объявление атрибутов <!ATTLIST родительский_элемент имя тип режим_использования> Типы атрибутов: ID, CDATA, IDREF и т.д. Режимы: #IMPLIED, #REQUIRED, «значение по умолчанию» DTD. Пример объявления атрибутов <!ATTLIST снабжение номер CDATA #REQUIRED > <!ATTLIST поставщик код ID #REQUIRED имя CDATA #REQUIRED статус CDATA "10" город CDATA #REQUIRED > <!ATTLIST товар код ID #REQUIRED назв CDATA #REQUIRED цвет (синий | красный | белый | иной) #IMPLIED город CDATA # IMPLIED > DTD. Недостатки Отличный от XML синтаксис языка Нет проверки типов данных. В DTD есть только один тип – строка В DTD нет пространств имен. Нельзя поставить в соответствие документу два и более DTD описаний XSD. Главные XML-схемы XSD — альтернативный способ создания правил построения XML-документов По сравнению с DTD схемы обладают более мощными средствами для определения сложных структур данных, обеспечивают более понятный способ описания грамматики языка, способны легко модернизироваться и расширяться. XSD позволяют описывать правила для XMLдокумента средствами самого же XML XSD. Стандарты XML DTD for XML-Data-Schema Версия 1.0 была одобрена в качестве рекомендации консорциума W3C 2 мая 2001 года 28 октября 2004 года была опубликована вторая редакция версии 1.0, исправляющая ряд ошибок XSD. Корневой элемент schema — корневой элемент любой XSD-схемы в XSD всегда пространство имен задается URL http://www.w3c.org/2001/XMLSchema в XSD для обозначения пространства имен принято использовать префикс xsd <xsd:schema xmlns:xsd=http://www.w3c.org/2001/XMLSchema> XSD. Сложные и простые типы Элемент простого типа не может содержать другие элементы или атрибуты Элемент простого типа задается конструкцией simpleType Комплексный тип может создавать эффект встраивания элементов в другие элементы или может ассоциировать атрибуты с элементом Элемент сложного типа задается конструкцией complexType XSD. Определение простых типов Некоторые из простых типов, например string и decimal встроены в язык XML-схемы, в то время как другие определены специально для конкретных документов Для определения имени и типа собственного простого типа используют оператор simpleType. С помощью оператора restriction указывают прототип и идентифицируют фасеты XSD. Примеры простых типов XSD. Ограничение вхождений minOccures — минимальное число экземпляров элемента (например, 0 ) maxOccures — максимальное число экземпляров элемента (например, 1 или unbounded) Пример: <xsd:element name="test" minOccurs="0" maxOccurs="unbounded">…</xsd:element> XSD. Ограничение вхождений minOccures — минимальное число экземпляров элемента (например, 0 ) maxOccures — максимальное число экземпляров элемента (например, 1 или unbounded) Пример: <xsd:element name="test" minOccurs="0" maxOccurs="unbounded">…</xsd:element> XSD. Определение элементов В определении элемента указываются: имя элемента, его тип, количество вхождений и структура Совокупность дочерних элементов обозначается как sequence (характерно только для элементов сложного типа) Совокупность атрибутов элемента задается непосредственно в элементе complexType XSD. Пример определения элементов <xsd:element name="Снабжение"> <xsd:complexType> <xsd:sequence> <xsd:element name="Поставщик"> <xsd:complexType> <xsd:sequence> <xsd:element name="Поставка"> … </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> XSD. Определение атрибутов В определении атрибута указываются: имя атрибута, тип данных и режим использования Совокупность атрибутов элемента задается непосредственно в элементе complexType XSD. Пример определения атрибутов <xsd:element name="Снабжение"> <xsd:complexType> <xsd:sequence> <xsd:element name="Поставщик"> <xsd:complexType> <xsd:attribute name="ID" type="xsd:string“ use="required"/> <xsd:attribute name=“name" type="xsd:string“ use="required"/> <xsd:attribute name=“status" type="xsd:positiveInteger" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="ID" type="xsd:string“ use="required"/> </xsd:complexType> </xsd:element> RelaxNG. Почему XSD недостаточно? XSD решает все проблемы DTD: он является XML приложением, и позволят описывать все мыслимые виды ограничений на структуру документа XSD характеризуется излишней сложностью На основе языков TREX и RELAX был разработан язык схем, названный RELAX NG RELAX NG (REgular LAnguage for XML Next Generation) RelaxNG. Корневой элемент Корневой элемент — grammar Описание конструкций Relax NG — start Пространство имен в Relax NG относится к URL http://relaxng.org/ns/structure/1.0 <?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0"> <start> </start> </grammar> RelaxNG. Элементы <?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0"> <start> <element name="Снабжение"> <element name="Поставщик"> <element name="Поставка"> <element name="Товар"> </element> </element> </element> </element> </start> </grammar> RelaxNG. Атрибуты <?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0"> <start> <element name="Снабжение"> <attribute name="ID"> <text /> </attribute> <element name="Поставщик"> <attribute name="ID"> <text /> </attribute> <attribute name="name"> <text /> </attribute> <attribute name="status"> <text /> </attribute> <element name="Поставка"> <element name="Товар"> </element> </element> </element> </element> </start> </grammar> RelaxNG. Смешанное содержимое <element name="subject"> <mixed> <element name="b"> <text /> </element> <element name="i"> <text /> </element> </mixed> </element> Элемент test может содержать как текст, так и один элемент b или один элемент i. RelaxNG. Опциональные элементы <element name="subject"> <mixed> <optional> <element name="b"> <text /> </element> </optional> <optional> <element name="i"> <text /> </element> </optional> </mixed> </element> Элемент test может содержать как текст, так и один элемент b или один элемент i. RelaxNG. Альтернатива <element name="location"> <choice> <element name="description"><text/></element> <element name="place"><text/></element> </choice> </element> Элемент location может содержать или один элемент description, или один элемент place. … RelaxNG. Множественные вхождения <element name="Снабжение"> <oneOrMore> <element name="Поставщик"> <zeroOrMore> <element name="Поставка"> <oneOrMore> <element name="Товар"> </element> </oneOrMore> </element> </zeroOrMore> </element> </oneOrMore> </element> …