Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы XML-технологий. Учебное пособие
.pdf
ре
гулярное выражение, с которым должно сопоставляться прове-
ряемое значение.
Например, на элемент
Гр
м
ожет быть наложено ограничение,
уппа
чтобы его значение состояло из четырех прописных символов,
за которыми следуют один строчный символ знак
в диапазоне от
на языке
<
Элемент
XSD
можно представить с помощью следующего шаблона:
xs:pattern value="[А-Я]{4}[а-я]{1}-[1-6]{2}"/>
en
о
д
1
umeration
(
6
например,
Б
ЭВМд-41
,
М
ЭВМд-52
позволяет ограничить простой тип набором
различимых значений. Например, на элемент
«-»
и две цифры
Это требование
).
С
татус
,
содержащий
данные о статусе студента, можно наложить ограничение, согласно
которому он может иметь только значения
агистр
М
следующего перечисления
. Такое требование можно представить в схеме с помощью
enumeration
xs:enumeration value="Бакалавр"/>
<
<xs:enumeration value="Специалист"/>
<xs:enumeration value="Магистр"/>
РЕ ДЕЛЕН ИЕ ПРОСТЫ Х ПОЛЬЗОВАТЕЛЬ СКИХ ТИ ПО В
П
3.2.5
О
:
Б
акалавр
С
пециалист
,
и
ли
ольшинство языков программирования позволяет разработчи-
Б
кам только компоновать различные встроенные типы в структурированные типы и не дает возможность определять новые простые
типы, имеющие определенные пользователем области значений.
Возможности определения данных через встроенные типы есть
XML
и в
ожно представить следующим образом:
м
<xs:element name="Фамилия" type="xs:string"/>
<xs:element name="Имя" type="xs:string"/>
<xs:element name="Отчество" type="xs:string"/>
<xs:element name="датаРождения" type="xs:date"/>
Н
Например, элементы
.
о
XML Schema
кроме встроенных типов данных, позволяет поль-
,
Фамилия
,
Имя
Отчество
,
датаРождения
и
зователям определять собственные простые типы, области значений
которых являются подмножествами встроенных типов.
Другими словами, пользовательский тип данных определяется
как ограничение, накладываемое на другой тип данных
71
X
ML
.

А
налогичные возможности дают современные СУБД, позволяющие
вводить пользовательские типы данных путем определения доменов.
ML
Механизм ввода пользовательского типа в
X
S
chema
в
ключает
в себя следующие действия.
1. Для определения нового простого типа используется элемент
x
s:simpleType
В элементе
2.
область значений ограничивается с помощью элемента
3. В
.
элементе
s:simpleType
x
s:restriction
x
:string
определяется базовый тип (
xs
xs:restriction
), чья
.
вы определяете, как именно вы хотите
ограничивать базовый тип, сужая один или более из его аспектов
f
(
acets
)
. Варианты ограничений базового типа данных приведены
в нижеследующих пунктах.
.2.5.1 По ль зо ва те льс ки е ти пы с о г р ан ич е н и ем
3
д
иа па зо но в
Например, следующие простые типы ограничивают области зна-
x
чений
s: minInclusive
x
s:double
<!-- Файл SimpleElm.xsd -->
<?xml version="1.0" encoding="UTF-8"?>
x
s:date
и
и
s:maxInclusive
x
о более узких диапазонов, используя аспекты
д
:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:x="http://example.org/publishing"
targetNamespace="http://example.org/publishing" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- Определение типа RoyalityRate -->
<xs:simpleType name="RoyalityRate">
<xs:restriction base="xs:float">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<!-- Определение типа Pubs2003 -->
<xs:simpleType name="Pubs2003">
<xs:restriction base="xs:date">
72

<xs:minInclusive value="2003-01-01"/>
<xs:maxInclusive value="2003-12-31"/>
</xs:restriction>
</xs:simpleType>
<!-- Объявление переменных типов RoyalityRate, Pubs2003 -->
<xs:element name="rate" type="x:RoyalityRate"/>
<xs:element name="publicationDate" type="x:Pubs2003"/>
</xs:schema>
осле определения простых типов
П
них строках
:RoyalityRate
д
ля типов
ледующие документы содержат корректные экземпляры опре-
С
x
XML-
yaltyRate
Ro
сх
емы определены переменные
:Pubs2003
x
,
.
и
ubs2003
P
и
rate
ослед-
в п
publicationDate
деленных выше документов:
!-- Переменная типа RoyalityRate -->
<
<x:rate xmlns:x="http://example.org/publishing">17.34567890</x:rate>
<!-- Переменная типа Pubs2003 -->
<x:publicationDate xmlns:x="http://example.org/publishing">
2003-06-01
</x:publicationDate>
.2.5.2 По ль зо ва те льс ки е ти пы с л е к с и ч е с ки ми
3
о
гр ан ич ен ия м и
Большинство аспектов ограничивают область значений типа,
в то время как шаблонный аспект ограничивает лексическую
область типа. Предыдущие примеры ограничивали область значений
базового типа,
риведенные далее - ограничивают лексическую
п
а
область строки с помощью регулярных выражений:
<!-- Файл SimpleElm_lexOgranich.xsd -->
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:x="http://example.org/publishing"
targetNamespace="http://example.org/publishing"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="SSN">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-\d{2}-\d{4}"/>
73

</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PublisherAssigned">
<xs:restriction base="xs:string">
<xs:pattern value="\d{2}-\d{8}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Phone">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-\d{3}-\d{4}"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="authorId" type="tns:SSN"/>
<xs:element name="pubsAuId" type="tns:PublisherAssigned"/>
<xs:element name="phone" type="tns:Phone"/>
</xs:schema>
ледующие документы содержат корректные экземпляры опре-
С
деленных выше пользовательских типов данных:
!-- Файл SimpleElm_lexOgranich_authorId.xml-->
<
<?xml version="1.0" encoding="UTF-8"?>
<x:authorId xmlns:x="http://example.org/publishing">
123-45-6789
</x:authorId>
<!-- Файл SimpleElm_lexOgranich_pubs.XML-->
<?xml version="1.0" encoding="UTF-8"?>
<x:pubsAuId xmlns:x="http://example.org/publishing">
01-23456789
</x:pubsAuId>
<!-- Файл SimpleElm_lexOgranich_phone.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<x:phone xmlns:x="http://example.org/publishing">
(801)390-45-52
</x:phone>
74

.2.5.3 По ль зо ва те льс ки е ти пы н а о с н о в е с п и с ко в
3
о бъ ед ин ен и й др уг их т ип о в
и
Кроме ограничения области значений типа, можно создать
новые простые типы, являющиеся списками или объединениями
s:restriction
других простых типов. Для этого вы используете не
x
,
x
а элементы
s:list
или
типов вы можете использовать следующие конструкции
x
s:restriction
новый тип является ограничением существующего
–
x
s:union
. Таким образом, для создания простых
схемы:
XM
L-
типа, т. е. он имеет более узкий ряд допустимых значений;
s:list
x
–
н
овый тип является разделенным пробелами списком
другого простого типа;
н
s:union
x
–
овый тип является объединением двух или более
других простых типов.
Используя
x
s:list
,
вы, по существу, определяете разделенный
пробелами список значений из определенной области значений. При
использовании
использовании
и
x
s:list
s:restriction
x
ли
x
s:union
поэтому в этих случаях не выполняется
,
совместимость типов. В следующем примере новый тип
ределяется как список
оп
!-- Файл SimpleElm_list.xsd -->
<
<?xml version="1.0" encoding="UTF-8"?>
S
SN
н
ет иерархии наследования, как при
начений.
з
uthorList
A
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:x="http://example.org/publishing"
targetNamespace="http://example.org/publishing"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="SSN">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-\d{2}-\d{4}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AuthorList">
<xs:list itemType="tns:SSN">
</xs:simpleType>
<xs:element name="authors" type="tns:AuthorList"/>
Следующий документ содержит экземпляр элемента
au
thors
:
75

!-- Файл SimpleElm_list.xml-->
<
<?xml version="1.0" encoding="UTF-8"?>
<x:authors xmlns:x="http://example.org/publishing">
111-11-1111 222-22-2222 333-33-3333 444-44-4444
</x:authors>
случае использования
В
x
s:union
ы создаете новый тип, комби-
в
нирующий множество областей значений, в которой значением
может быть из любой из указанных областей значений. Например,
Au
thorId
следующий тип
значений
<
!-- Файл SimpleElm_union.xsd -->
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:x="http://example.org/publishing"
targetNamespace="http://example.org/publishing"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="SSN">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-\d{2}-\d{4}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PublisherAssigned">
ublisherAssignedId
P
с
очетает область значений
:
S
SN
с
областью
<xs:restriction base="xs:string">
<xs:pattern value="\d{2}-\d{8}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AuthorId">
<xs:union memberTypes="tns:SSN tns:PublisherAssigned"/>
</xs:simpleType>
<xs:element name="author" type="tns:AuthorId"/>
</xs:schema>
аждый из следующих документов демонстрирует корректный
К
экземпляр элемента
<
!-- Файл SimpleElm_union.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<x:author xmlns:x="http://example.org/publishing">
111-11-1111
</x:authorId>
uthorId
a
:
76

<
!-- Файл SimpleElm_union.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<x:author xmlns:x="http://example.org/publishing">
11-11111111
</x:authorId>
П
оддержка
ML Schema
X
д
ля определенных пользователем типов
и, в частности, «специальных значений»/«лексических областей»
является одним из наиболее мощных аспектов языка. Тот факт, что
большинство языков программирования не обеспечивает этого,
вынуждает разработчиков решать эти вопросы в коде своих приложений самостоятельно (обычно через механизмы установки свойств). Способность определять «специальные значения»/«лексические области», удовлетворяющие вашим точным
потребностям, делает возможным осуществлять проверку правильности и обработку ошибок данных не в программном коде,
а на уровне
3.2.6
XML Schema
О
типы в структуру, известную как составной тип (
-процессора.
X
ML
ПР ЕДЕЛЕ НИ Е СОСТАВН ЫХ ТИ ПОВ
д
елает возможным компоновать различные простые
c
omplexType
).
3.2.6.1 Пр ос то й пр им е р со с т ав но го э л е м е н т а
Чтобы определить новый составной тип в целевом пространстве
имен схемы, вы используете элемент
x
s:complexType
как показано
,
в листинге:
<xs:complexType name="AuthorType">
<!-- здесь размещается композитор -->
</xs:complexType>
лемент
Э
x
s:complexType
одержит то, что известно как составитель,
с
который описывает формирование содержимого типа, также известного как модель содержимого.
X
ML Schema
пределяет трех составите-
о
лей, которые могут использоваться при описании составного типа:
– уп
s:sequence
x
x
s:all
– все части в любом порядке;
s:choice
x
– в
орядоченная последовательность частей;
ыбор содержащихся частей.
77

С
оставители содержат части, которые включают такие объекты,
как другие составители, описания элементов и типовые группы.
Описания атрибутов не считаются частями, потому что они не
повторяются. Следовательно, описания атрибутов помещаются не
в составителе, а после него в конце определения составного типа.
Описание элемента (
x
s:element
используемая часть. Следующий
, возможно, наиболее часто
)
mplexType
co
, названный
uthorType
A
,
определяет упорядоченную последовательность двух дочерних
элементов и атрибута, имеющих простые типы:
!-- Файл ComplexElm_unqualified.xsd -->
<
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:x="http://example.org/publishing"
targetNamespace="http://example.org/publishing">
<xs:complexType name="AuthorType">
<!-- Синтаксис композитора (составителя) -->
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
</xs:sequence>
<!-- определение атрибута -->
<xs:attribute name="id" type="xs:integer"/>
</xs:complexType>
<!-- определение элемента “author” и его типа -->
<xs:element name="author" type="x:AuthorType"/>
</xs:schema>
3
.2.6.2 Бо ле е сл ож н ы й п р и м е р со ст ав но г о э ле м е н та
А теперь приведем немного более сложный пример составного
типа, который использует вложенные составные типы, другие составители и повторяющиеся части:
<!-- Файл ComplexElm_all_choice.xsd -->
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:x="http://example.org/publishing"
78

t
argetNamespace="http://example.org/publishing"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- определение простого типа SSN -->
<xs:simpleType name="SSN">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-\d{2}-\d{4}"/>
</xs:restriction>
</xs:simpleType>
<!-- определение простого типа Address -->
<xs:complexType name="Address">
<xs:all>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string" minOccurs="0"/>
<xs:element name="state" type="xs:string" minOccurs="0"/>
<xs:element name="zip" type="xs:string"/>
</xs:all>
</xs:complexType>
<!-- определение простого типа PublicationListType -->
<xs:complexType name="PublicationListType">
<xs:choice maxOccurs="unbounded">
<xs:element name="book" type="xs:string"/>
<xs:element name="article" type="xs:string"/>
<xs:element name="whitepaper" type="xs:string"/>
</xs:choice>
</xs:complexType>
<!-- определение простого типа Phone -->
<xs:simpleType name="Phone">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-\d{3}-\d{4}"/>
</xs:restriction>
</xs:simpleType>
<!-- определение составного типа AuthorType -->
<xs:complexType name="AuthorType">
<xs:sequence>
<xs:choice>
<xs:element name="name" type="xs:string"/>
<xs:element name="fullName" type="xs:string"/>
79

</xs:choice>
<xs:element name="address" type="x:Address"/>
<xs:element name="phone" type="x:Phone" minOccurs="0" maxOccurs="5"/>
<xs:element name="recentPublications" type="x:PublicationListType"/>
</xs:sequence>
<xs:attribute name="id" type="x:SSN"/>
</xs:complexType>
<xs:element name="author" type="x:AuthorType"/>
/xs:schema>
этом примере составитель
В
all
определении
в
Address
что порядок следования элементов в экземпляре
может быть произвольным.
В описании элемента
включающий в себя другой составитель типа
sequence
,
Au
thorType
содержится составитель типа
рым следуют описания трех элементов.
ch
oice
Составитель
типа
A
uthorType
допускается появление элементов
в
этом определении означает, что в элементе
или
n
ame
В качестве типов элементов, следующих за составителем
выбраны пользовательские составные типы:
и
P
ublicationsListType
.2.6.3 Ог ра ни че ни я к о ли ч е с тв а эл е м ен т о в
3
.
AddressType, Phone
Обратите также внимание, что с помощью атрибутов
и
m
axOccurs
исание элемента
оп
ph
one
ределяет ограничения появле-
оп
X
ML
choice
начает,
оз
-д
окумента
за кото-
,
f
ullName
m
.
choice
inOccurs
,
ний (
o
ccurrence
c
onstraints
. В составном типе ограничения появлений
)
могут применяться к любой части.
Стандартное значение для каждой части –
,
это означает, что
1
данная часть должна появиться в указанном месте именно один раз.
Определение
а определение
inOccurs="0"
m
axOccurs="unbounded"
m
де
лает данную часть необязательной,
позволяет бесконечные повторения части. Если пожелаете, вы можете задать также произвольные
границы, например,
minOccurs="3" maxOccurs="77"
.
Использование ограничений появлений по отношению к составителю применяется ко всей группе как к целому (обратите внимание на
blicationsListType
,
который применяет ограничения появлений
Pu
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
