Содержание
Перед загрузкой любого xml документа встает проблема валидации. В XML есть несколько уровней корректности документа: ненарушение синтаксиса, валидация (документ соответствует своей грамматике). Для этого служит DTD (см. предыдущую статью). Но DTD сегодня считается устаревшим способом проверки. Хоть он и применяется сегодня, но по сути давно уже уступил место другому стандарту — XML схемам.Почему постепенно отказываются от DTD? У него есть ряд недостатков:
- сам по себе dtd не является xml, т.е. у него отличный от xml синтаксис языка.
- Нет проверки типов данных.
- Нельзя поставить документу в соответствие 2 и более DTD описаний (актуально для составных документов).
И в конце 90-х гг. консорциум w3.org начал работу над новым стандартом. И к 2003г. стандарт был готов и назван ‘xml схема’.
XML схема — это способ описания грамматики какого-то документа. На деле схемы оказались гораздо функциональнее, чем просто описание документа. На сегодня схемы могут описывать любые данные (вплоть до баз данных и объектов с классами). Сегодня схемы стали основным способом описания данных в xml.
XML схема описывает:
- Словарь (что и с какими именами у вас есть, если это база данных — описание таблиц и колонок, если это xml документ — описываются названия атрибутов и элементов, если это программирование — как называются классы и свойства).
- Модель содержания (что во что входит, т.е. отношения между элементами и атрибутами и их структура).
- Типы данных — базовые (встроенные) и созданные вами.
Для любой схемы указывается пространство имен:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> //или так <xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="examle.xsd">
Элементы XML схемы
Разберем устройство схемы на примере:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:annotation> <xsd:documentation> Схема </xsd:documentation> </xsd:annotation> </xsd:schema>
Сама схема представляет из себя xml файл.
- Корневой элемент schema и пространство имен.
- Блоки документации — описание схемы.
Можно 1 раз написать схему и использовать ее много раз в различных ситуациях.
Описание элементов схемы
Все элементы схемы описываются с помощью конструкции:
<xs:element name="apple" type="xs:string"/> <xs:element name="price" type="xs:integer"/>
Т.е. пишем имя элемента, а затем тип данных — строка, число и т.д. Причем, если один элемент находится внутри другого элемента, то он наследует его тип данных (как в программировании).
Соответствие схемы и документа
Нет жесткой привязки документа и схемы (в отличие от DTD). Привязка документ-схема делается не в документе. Это делает ваша программа, т.е. в документе не надо указывать ссылку на схему.
Привязка схемы к документу происходит по пространству имен. Сама схема определяет пространство имен нашего документа, а не конкретный документ. Если нужно привязаит схему к нескольким документам, то в схеме прописываем пространство имен, соответствующее каждому документу:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.phpmove.ru" xmlns="http://fruit.com" xmlns:apple="http://apple.com" xmlns:orange="http://orange.com">
В самом документе упоминания об xml схеме может и не быть. Часто это так и происходит. Но в документе может быть декларативное описание, где рекомендуется посмотреть эту схему (типа подсказки). Но это не значит, что документ будет обязательно оттуда брать эту схему:
<my:fruit xmlns:my="http://www.fruit.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.fruit.com/fruit.xsd">
Т.е. мы просто при помощи schemaLocation указываем полный путь к нашей схеме.
В то же время сам документ может не принадлежать ни к какому пространству имен. Тогда используют noNamespaceSchemaLocation (необязательный атрибут). Т.е. в коде ниже указываем, где взять схему без привязки к пространству имен:
<xsi:noNamespaceSchemaLocation="www.phpmove.ru/example.xsd">
Атрибут noNamespaceSchemaLocation нужен для валидатора, чтобы он знал, где брать схему.
Типы данных в xml схеме
Все типы данных делятся на простые и сложные типы. Простые:
- int — 1234567.
- integer — 123456.
- short — 1234.
- long — 1234567865432345678.
- decimal — 1,234.
- double — 1,2222.
- float — 1,2222.
- string — строка.
- name — Evgeny.
- Qname — doc:Data (квалификационное имя, например, имя пространства имен).
- AnyURI — какой-то url адрес.
- base64Binary — строка, в которую предполагается загонять бинарные данные после сериализации в base64.
- Date — дата (2012-09-27).
- DateTime — дата и время.
- Time — время (22:42:00.000).
- ID — идентификатор.