Основы XML Презентация 6 – XML Schemas T-Systems CIS, 2011 XML Schemas Преимущества XML Schemas - XML Schemas создаются на основе XML, в то время как DTD используют другой синтаксис -XML Schemas полностью поддерживают рекомендацию по пространствам имён -XML Schemas позволяют проверять содержимое текстовых элементов на основе встроенных и определяемых пользователем типов данных -XML Schemas позволяют создавать сложные и повторно используемые модели содержимого -XML Schemas обеспечивают моделирование программных концепций, таких как наследование и подстановка типов Объявления schema (1) Объявления schema <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ordermanagement.t-systems.com/V1.0" targetNamespace="http://ordermanagement.t-systems.com/V1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" > … </xs:schema> Объявления schema (2) Целевые пространства имён Основное назначение XML Schemas – объявление словарей. Эти словари могут идентифицироваться пространством имён, указанном в атрибуте targetNamespace: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ordermanagement.t-systems.com/V1.0" targetNamespace="http://ordermanagement.t-systems.com/V1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" > … </xs:schema> Объявления schema (3) Квалификация элементов и атрибутов Элемент или атрибут называется квалифицированным, если имеется связанное с ним пространство имён. <name xmlns="http://www.t-systems.com/test-school/name"> <first/> <middle/> <last/> </name> <ns:name xmlns:ns="http://www.t-systems.com/test-school/name"> <ns:first/> <ns:middle/> <ns:last/> </ns:name> <ns:name xmlns:ns="http://www.t-systems.com/test-school/name"> <first/> <middle/> <last/> </ns:name> Объявления schema (4) Квалификация элементов и атрибутов (продолжение) <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ordermanagement.t-systems.com/V1.0" targetNamespace="http://ordermanagement.t-systems.com/V1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" > … </xs:schema> Объявления element (1) Объявления элементов <element name= "имя элемента" type="глобальный тип" ref="глобальное объявление элемента" form="qualified или unqualified" minOccurs= "неотрицательное число" maxOccurs="неотрицательное число или unbounded" default= "значение по умолчанию" fixed="фиксированное значение" > Объявления element (2) Глобальные и локальные объявления Глобальное объявление является непосредственным потомком элемента <schema> и может использоваться в XML-схеме повторно <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ordermanagement.tsystems.com/V1.0" targetNamespace="http://ordermanagement.t-systems.com/V1.0" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name='root' type=“xs:string"/> </xs:schema> Объявления element (3) Глобальные и локальные объявления Локальное объявление не является непосредственным потомком элемента <schema> и может использоваться только в своём конкретном контексте <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ordermanagement.tsystems.com/V1.0" targetNamespace="http://ordermanagement.t-systems.com/V1.0" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name='name'> <xs:complexType> <xs:sequence> <xs:element name="first" type="xs:string" maxOccurs="1"/> <xs:element name="middle" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="last" type="xs:string" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> Объявления element (4) Создание локального типа complexType Для создания локального типа объявление типа включается в объявление элемента как дочерний элемент: <xs:element name='name'> <xs:complexType> <xs:sequence> <xs:element name="first" type="xs:string" maxOccurs="1"/> <xs:element name="middle" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="last" type="xs:string" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> Объявления element (5) Создание локального типа simpleType Для создания локального типа объявление типа включается в объявление элемента как дочерний элемент: <xs:element name='phone'> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="home"/> <xs:enumeration value="work"/> <xs:enumeration value="cell"/> <xs:enumeration value="fax"/> </xs:restriction> </xs:simpleType> </xs:element> Объявление типа может содержать определение complexType или simpleType, но не оба одновременно. Объявления element (6) Использование глобального типа Многие элементы имеют одно и то же содержимое. Вместо объявления в схеме локальных типов, копирующих друг друга, можно создать глобальный тип, на который будут ссылаться объявления элементов: <xs:complexType name="nameType"> <xs:sequence> <xs:element name="first" type="xs:string" maxOccurs="1"/> <xs:element name="middle" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="last" type="xs:string" maxOccurs="1"/> </xs:sequence> </xs:complexType> <xs:element name=“CustomerName" type="tns:nameType"/> <xs:element name=“PartnerName" type="tns:nameType"/> Несмотря на то, что тип глобальный, он остаётся частью целевого пространства имён, поэтому при ссылке на него указывается префикс целевого пространства имён. Объявления element (7) Использование ссылки на глобальный элемент Для повторного использования уже определенной модели содержимого можно использовать ссылки на глобальные элементы: <xs:element name="first" type="xs:string" /> <xs:element name="middle" type="xs:string" /> <xs:element name="last" type="xs:string" /> <xs:complexType name="nameType"> <xs:sequence> <xs:element ref="tns:first" maxOccurs="1"/> <xs:element ref="tns:middle" minOccurs="0" maxOccurs="1"/> <xs:element ref="tns:last" maxOccurs="1"/> </xs:sequence> </xs:complexType> <xs:element name="name" type="tns:nameType"/> В этом случае ссылка на глобальный элемент также включает префикс целевого пространства имён. Объявления element (8) Квалифицированная форма элемента <element name= "имя элемента" type="глобальный тип" ref="глобальное объявление элемента" form="qualified или unqualified" minOccurs= "неотрицательное число" maxOccurs="неотрицательное число или unbounded" default= "значение по умолчанию" fixed="фиксированное значение" > Если элемент квалифицирован, при использовании в XML документе он должен иметь связанное с ним пространство имён. Если атрибут form в объявление элемента не включен, используется значение атрибута elementFormDafault элемента schema. Глобальные элементы всегда должны быть квалифицированы, независимо от значений этих атрибутов. Объявления element (9) Число элементов <element name= "имя элемента" type="глобальный тип" ref="глобальное объявление элемента" form="qualified или unqualified" minOccurs= "неотрицательное число" maxOccurs="неотрицательное число или unbounded" default= "значение по умолчанию" fixed="фиксированное значение" > Атрибуты minOccurs и maxOccurs не допускаются при объявлении глобальных элементов и могут использоваться в ссылках на глобальные элементы или при объявлении локальных типов. Объявления element (10) Число элементов - пример <xs:element name="first" type="xs:string"/> <xs:element name="middle" type="xs:string"/> <xs:element name="last" type="xs:string"/> <xs:complexType name="nameType"> <xs:sequence> <xs:element ref="tns:first"/> <xs:element ref="tns:middle" minOccurs="0"/> <xs:element ref="tns:last"/> </xs:sequence> </xs:complexType> <xs:element name="phone"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="home"/> <xs:enumeration value="work"/> <xs:enumeration value="cell"/> <xs:enumeration value="fax"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:complexType name="customerType"> <xs:sequence> <xs:element name="CustomerName" type="tns:nameType" maxOccurs="unbounded"/> <xs:element ref="tns:phone" maxOccurs="5"/> </xs:sequence> </xs:complexType> Объявления element (11) Значения по умолчанию и фиксированные значения <element name= "имя элемента" type="глобальный тип" ref="глобальное объявление элемента" form="qualified или unqualified" minOccurs= "неотрицательное число" maxOccurs="неотрицательное число или unbounded" default= "значение по умолчанию" fixed="фиксированное значение" > Чтобы указать значение по умолчанию, включите в объявление элемента атрибут default с требуемым значением. Если значение элемента не может изменяться, включите в объявление элемента атрибут fixed с нужным значением. Объявления element (11) Шаблоны элементов (element wildcards) Иногда в схему требуется включить элементы без явного их объявления. Для этих целей используется объявление следующего вида: <xs:any minOccurs="неотрицательное число" maxOccurs="неотрицательное число " namespace=“##any или ##other или ##targetNamespace или ##local или допустимое пространство имён" processContents=“lax или skip или strict" /> Объявление any не может быть глобальным, должно находиться в модели содержимого. Объявления element (12) Шаблоны элементов - processContents -skip: программа пропускает любые шаблонные элементы в экземпляре документа. -lax: программа пытается проверять шаблонные элементы, если имеет доступ к глобальным определениям XML-схем для этих элементов -strict: программа пытается проверить шаблонные элементы и генерирует сообщение об ошибке, если не находит глобальных определений XML-схем для этих элементов Объявления element (13) Шаблоны элементов - пример <xs:complexType name="nameType"> <xs:sequence> <xs:element ref="tns:first"/> <xs:element ref="tns:middle" minOccurs="0"/> <xs:element ref="tns:last"/> <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="skip"/> </xs:sequence> </xs:complexType> Объявления complexType (1) complexType – атрибут mixed <xs:complexType mixed="true или false" name="имя типа"> … </xs:complexType> Атрибут mixed определяет модель содержимого. Смешанная модель содержимого допускает содержимое элемента, состоящее как из дочерних элементов, так и из текста: <Name>Ivan Petrovich <LastName>Sidorov</LastName></Name> Объявления complexType (2) complexType – атрибут name <xs:element name="first" type="xs:string" /> <xs:element name="middle" type="xs:string" /> <xs:element name="last" type="xs:string" /> <xs:complexType name="nameType"> <xs:sequence> <xs:element ref="tns:first" maxOccurs="1"/> <xs:element ref="tns:middle" minOccurs="0" maxOccurs="1"/> <xs:element ref="tns:last" maxOccurs="1"/> </xs:sequence> </xs:complexType> <xs:element name="name" type="tns:nameType"/> Атрибут name включается в определение типа только в том случае, если тип определен как глобальный. Локальные типы не имеют атрибута name, то есть являются анонимными. Объявления complexType (3) complexType – пустая модель Элемент определенный с пустой моделью содержимого: <xs:element name=“emptyElement" > <xs:complexType /> </xs:element> Такое определение не разрешает элементу содержать ни текст, ни дочерние элементы. Объявления group (1) Объявление глобальной группы Группа определяется следующим образом: <xs:group name= "имя группы" > … </xs: group > Все глобальные определения групп должны быть именованы. Объявления group (2) Пример использования группы <xs:element name="first" type="xs:string"/> <xs:element name="middle" type="xs:string"/> <xs:element name="last" type="xs:string"/> <xs:group name="nameGroup"> <xs:sequence> <xs:element ref="tns:first"/> <xs:element ref="tns:middle" minOccurs="0"/> <xs:element ref="tns:last"/> </xs:sequence> </xs:group> <xs:complexType name="nameType"> <xs:group ref="tns:nameGroup"/> </xs:complexType> Объявления sequence Объявление последовательности Последовательность определяется следующим образом: <xs:sequence minOccurs= "неотрицательное число" maxOccurs= "неотрицательное число или unbounded" > … </xs:sequence> Атрибуты minOccurs и maxOccurs применяются ко всей последовательности. Объявление <sequence> может содержать объявления элементов, шаблоны элементов, внутренние элементы <sequence>, ссылки на группы и элементы <choice>. Это позволяет создавать последовательности внутри последовательностей внутри последовательностей или варианты выбора в последовательностях, которые, в свою очередь, находятся в группах – то есть, практически любые комбинации. Объявления choice Объявление выбора Выбор определяется следующим образом: <xs:choice minOccurs= "неотрицательное число" maxOccurs= "неотрицательное число или unbounded" > … </xs:choice> Атрибуты minOccurs и maxOccurs применяются ко всему выбору. Внутри объявления <choice> может находиться неограниченное число дочерних объявлений, однако в экземпляре XML документа может использоваться только одно из этих объявлений. Объявления all Объявление all Конструкция all позволяет объявить, что все элементы в содержимом могут располагаться в произвольном порядке: <xs:all minOccurs= "0 или 1" maxOccurs= "1" > … </xs:all> Объявление all должно быть объявлением модели содержимого, являясь при этом дочерним по отношению к определению complexType. Объявление all может включать в качестве дочерних только объявления элементов. Объявления sequence, choice или group не допускаются. Дочерние по отношению к объявлению all элементы могут встречаться в экземпляре документа только один раз. Это значит, что в объявлении all значения атрибутов minOccurs и maxOccurs ограничены значениями 0 и 1. Объявления атрибутов (1) Объявление атрибутов <attribute name= "имя атрибута" type="глобальный тип" ref="глобальное объявление атрибута" form="qualified или unqualified" use= "optional или prohibited или required" default= "значение по умолчанию" fixed="фиксированное значение" > Объявления атрибутов (2) Объявление локального типа <xs:attribute name="Id"> <xs:simpleType> <xs:restriction base="xs:string"/> </xs:simpleType> </xs:attribute> Объявления атрибутов (3) Использование глобального типа <xs:simpleType name="attributeType"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:attribute name="Id" type="tns:attributeType"></xs:attribute> Объявления атрибутов (4) Ссылка на существующий глобальный атрибут <xs:complexType name="attrType"> <xs:attribute ref="tns:phone"/> </xs:complexType> Объявления атрибутов (5) Квалифицированная форма атрибута <attribute name= "имя атрибута" type="глобальный тип" ref="глобальное объявление атрибута" form="qualified или unqualified" use= "optional или prohibited или required" default= "значение по умолчанию" fixed="фиксированное значение" > Если атрибут квалифицирован, он должен иметь связанное с ним пространство имён. Если атрибут form не включен в объявление атрибута, используется значение атрибута attributeFormDefault элемента schema. Любой глобальный атрибут должен быть квалифицирован. В отличие от элементов, квалифицированные атрибуты в экземпляре XML документа используются редко. Объявления атрибутов (6) Использование атрибута <attribute name= "имя атрибута" type="глобальный тип" ref="глобальное объявление атрибута" form="qualified или unqualified" use= "optional или prohibited или required" default= "значение по умолчанию" fixed="фиксированное значение" > Способ использования атрибута задается атрибутом use: optional – атрибут необязательный prohibited – атрибут запрещён к использованию required – атрибут обязателен для использования Объявления атрибутов (7) Значение по умолчанию и фиксированные значения <attribute name= "имя атрибута" type="глобальный тип" ref="глобальное объявление атрибута" form="qualified или unqualified" use= "optional или prohibited или required" default= "значение по умолчанию" fixed="фиксированное значение" > Примеры: <attribute name="kind" type="tns:kindType" default="Home"/> <attribute name="version" type="xs:string" fixed="1.0"/> Объявления атрибутов (8) Шаблоны атрибутов (attribute wildcards) <anyAttribute namespace= "##any или ##other или ##targetNamespace или ##local" processContents="lax или skip или strict" > Объявление anyAttribute может находиться только в объявлениях complexType или AttributeGroup. Пример: <xs:complexType name="attrType"> <xs:anyAttribute namespace="##local http://www.w3.org/XML/1998/namespace" processContents="lax"/> </xs:complexType> Объявления группы атрибутов Объявление attributeGroup <attributeGroup name= "имя глобальной группы атрибутов" > <!-- Объявления атрибутов --> </attributeGroup> Объявление attributeGroup содержит объявления attribute, позволяет использовать шаблоны атрибутов и ссылки на глобальные атрибуты и группы атрибутов (при этом группа атрибутов не может рекурсивно ссылаться сама на себя). Создание элементов с простым содержимым и атрибутами simpleContent <xs:element name="phone"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="kind" type="xs:string" default="Home"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> Элемент simpleContent указывает, что complexType не может содержать дочерние элементы. Типы данных (1) Типы данных string - любые символьные данные normalizedString -нормализованная строка, в которой все пробелы, символы табуляции, возврата каретки и новой строки преобразованы в одинарные пробелы token - строка, в которой нет последовательностей из двух или более пробелов, символов табуляции, возврата каретки и новой строки byte - числовое значение от -128 до 127 unsignedByte - числовое значение от 0 до 255 base64Binary - бинарная информация, закодированная с использованием base64 Типы данных (2) Типы данных hexBinary - бинарная информация, закодированная с помощью шестнадцатиричного представления integer - числовое значение, представляющее целое число positiveInteger - целочисленное значение, большее 0 negativeInteger - целочисленное значение, меньшее 0 nonNegativeInteger - целочисленное значение, не меньшее 0 nonPositiveInteger - целочисленное значение, не большее 0 int - числовое значение от -2147483648 до -2147483647 Типы данных (3) Типы данных unsignedInt - числовое значение от 0 до 4294967295 long - числовое значение от -9223372036854775808 до 9223372036854775807 unsignedLong - числовое значение от 0 до 18446744073709551615 short - числовое значение от -32768 до 32767 unsignedShort - числовое значение от 0 до 65535 decimal - числовое значение, у которого может быть (а может и не быть) дробная часть Типы данных (4) Типы данных float - числовое значение, соответствующее 32-битовому числу одинарной точности в представлении IEEE, определенное стандартом IEEE 754-1985 double - числовое значение, соответствующее 64-битовому числу двойной точности в представлении IEEE, определенное стандартом IEEE 754-1985 boolean - логическое значение, включая true, false, 0 и 1 time - время суток в формате, определенном разделом 5.4 стандарта ISO 8601 (например, 15:45:00.000) dateTime - дата и время суток в формате, определенном разделом 5.4 стандарта ISO 8601 (например, 2011-11-01Т15:45:00.000) Типы данных (5) Типы данных duration - промежуток времени в формате, определенном в разделе 5.5.3.2 стандарта ISO 8601 (например, P30D - промежуток в 30 дней) date - дата по григорианскому календарю в формате, определенном в разделе 5.2.1 стандарта ISO 8601 (например, 2011-11-01) gMonth - месяц по григорианскому календарю в формате, определенном в разделе 3 стандарта ISO 8601 (например, 07) gYear - год по григорианскому календарю в формате, определенном в разделе 5.2.1 стандарта ISO 8601 (например, 2011) gYearMonth - месяц и год по григорианскому календарю в формате, определенном в разделе 5.2.1 стандарта ISO 8601 (например, 2011-07) Типы данных (6) Типы данных gDay - день по григорианскому календарю в формате, определенном в разделе 3 стандарта ISO 8601 (например, 19) gMonthDay - день некоторого месяца по григорианскому календарю в формате, определенном в разделе 3 стандарта ISO 8601 (например, 11-19) name - XML-имя, отвечающее рекомендации по пространствам имён QName - квалифицированное имя, отвечающее рекомендации по пространствам имён NCName - XML-имя без двоеточия, не включающее префикс пространства имён Типы данных (7) Типы данных anyURI - корректный URI language - языковая константа, определенная в RFC 1766, например en-US Пользовательские типы данных Пользовательские типы данных Пользовательские типы данных создаются при помощи объявления simpleType: <simpleType name="имя простого типа" final="#all или list или union или restriction"> При объявлении simpleType его необходимо основывать на уже существующих типах данных (поэтому объявления simpleType называют «порождёнными» (derived types)). Имеется три основных derived types: - типы-ограничения (restriction) - типы-перечисления (list ) - типы-объединения (union ) Пользовательские типы данных Объявление restriction Типы-ограничения создаются при помощи объявления restriction: <restriction base="имя типы, из которого порождён данный тип"> Дальнейшее ограничение возможных значений типа данных достигается за счёт использования т.н. аспектов (facet). Пользовательские типы данных Facets minExclusive - позволяет указать минимальное значение типа, исключая указанное значение minInclusive - позволяет указать минимальное значение типа, включая указанное значение maxExclusive позволяет указать максимальное значение типа, исключая указанное значение maxInclusive - позволяет указать максимальное значение типа, включая указанное значение totalDigits - позволяет указать общее количество цифр в числовом типе Пользовательские типы данных Facets fractionDigits - позволяет указать количество цифр дробной части числового типа (справа от десятичной точки) length - позволяет указать количество символов в строковом типе данных minLength - позволяет указать минимальное количество символов в строковом типе данных maxLength - позволяет указать максимальное количество символов в строковом типе данных Пользовательские типы данных Facets enumeration - позволяет указать допустимое значение в перечислении whiteSpace - позволяет указать как должны трактоваться пробельные символы pattern - позволяет ограничить строковый тип с помощью реглярных выражений Пользовательские типы данных Объявление list Типы-перечисления создаются при помощи объявления list: <xs:simpleType name="ContactItemType"> <xs:restriction base="xs:string"> <xs:enumeration value="phone"/> <xs:enumeration value="email"/> <xs:enumeration value="fax"/> <xs:enumeration value="post"/> <xs:enumeration value="visit"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="ContactListType"> <xs:list itemType="tns:ContactItemType"/> </xs:simpleType> Пользовательские типы данных Объявление union Типы-объединения создаются при помощи объявления union: <xs:simpleType name="UnknownString"> <xs:restriction base="xs:string"> <xs:enumeration value="Unknown"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="UnknownOrFloatType"> <xs:union memberTypes="xs:float tns:UnknownString"/> </xs:simpleType> Создание схемы из нескольких документов Объявление import Объявление import используется в тех случаях, когда в схему требуется включить объявления из другой схемы, имеющей другое значение targetNamespace. <import namespace="пространство имён другой схемы" schemaLocation="расположение другой схемы"> Объявление import должно быть глобальным. Создание схемы из нескольких документов Объявление include Объявление include используется в тех случаях, когда в схему требуется включить объявления из другой схемы, имеющей то же значение targetNamespace. < include schemaLocation="расположение другой схемы"> Объявление include должно быть глобальным. Документирование схемы Документирование Документирование схемы возможно с помощью комментариев, имеющих обычный для XML вид: <!-- This element contains ID of the customer, which refers to DBID in appropriate database table --> <xs:element name="CustomerId"> Другим вариантом является использование аннотаций: <xs:element name="CustomerId"> <xs:annotation> <xs:documentation>This element contains ID of the customer, which refers to DBID in appropriate database table</xs:documentation> </xs:annotation> </xs:element>