ss CDATA #IMPLIED>

<!ELEMENT text (#PCDATA)>

<!ATTLIST text number ID #REQUIRED

from CDATA #REQUIRED>

<!ELEMENT comment (#PCDATA)>

<!ATTLIST comment txt IDREF #REQUIRED>

]>

<note>

<date month="10" year= "2009"/>

<text number="n1" from="">

Завтра лекція з Web-дизану о 13.25

</text>

<text number= "n2" from="Керівник відділу">

Терміново здати звіт

</text>

<time txt="n1" hh="08" mm="15" ss="17" />

<time txt="n2" hh="13" mm="15" ss="00" />

<comment txt="n1">

Не забути конспект

</comment>

<comment txt="n1">

Що важливіше: лекція або звіт?

</comment>

</note>

Рисунок 9– Використання типів атрибутів з перерахуванням

У випадку, якщо в рядку

<!ATTLIST date day (Sunday | Monday | Thursday) “Monday”

значення, яке набуває атрибут за замовчанням, не відповідатиме значенням, які перлічені в дужках, обробник негайно повідомить про помилку (рис. 10).

Рисунок 10 – Повідомлення про помилку

У разі потреби вказати, що даний атрибут є необов'язковим, використовують оголошення типу необов'язкового атрибута.

<! ATTLIST date day (Sunday | Monday | Thursday ) #IMPLIED

month CDATA #REQUIRED

year CDATA #FIXED "2009">

АНАЛІЗ ПРАВИЛЬНИХ ЕКЗЕМПЛЯРІВ

Оголошення зовнішніх схем DTD. Основна відмінність внутрішніх і зовнішніх схем полягає в тому, що зовнішні схеми DTD зберігаються у вигляді окремого файлу, а не як частина XML-документа.

НЕ нашли? Не то? Что вы ищете?

До цих пір ми користувалися внутрішньою схемою DTD, яка задається таким чином:

<! DOCTYPE кореневий_елемент [>

<! ELEMENT кореневий_елемент (модель вмісту)

]> .

Все, що зазначалося в квадратах дужках, було внутрішньою схемою DTD. Зовнішні схеми DTD зберігаються в окремих файлах з розширенням *.dtd.

Повна схема DTD для екземпляра XML складається з комбінації внутрішньої і зовнішньої схем (якщо вони існують).

Для того, щоб підключити зовнішню схему DTD до XML-документа, необхідно в рядку оголошення типу документа вказати слово SYSTEM або PUBLIC, після якого вказати URL адреса файлу, що містить схему DTD:

PUBLIC – використовується, якщо схема загальнодоступна і використовується багатьма користувачами (такі схеми зберігаються в спеціальній бібліотеці – репозиторії);

SYSTEM – використовується для вказівки власних схем.

Наприклад,

<! DOCTYPE кореневий_елемент SYSTEM “my_dtd. dtd”>.

Розділ 3 СХЕМИ XDR

Незважаючи на всі переваги схем DTD, з ними пов'язаний ряд проблем:

1.  Передусім вони не є екземплярами XML, робота з ними вимагає від розробника вивчення іншої мови програмування, що використовує інший синтаксис.

2.  Створювати, перевіряти і підтримувати на відповідність за допомогою редакторів і утиліт XML достатньо важко.

3.  Схеми DTD не надають контроль за типами даних, окрім текстових даних і типів документів, що ускладнює перевірку на відповідність стандартам у додатках, що використовують інші типи даних, наприклад, фінансові транзакції, обмін даними, наукові дані.

4.  Схеми DTD не є екземплярами XML, тому немає можливості розширити і перетворити такі схеми.

5.  Схеми DTD не забезпечують підтримку просторів імен XML, які дозволяють змішувати в документі елементи різних структур документів.

У зв'язку з переліченими недоліками стала необхідність використання інших схем, альтернативних DTD.

Схеми XDR визначають елементи, подані в екземплярі XML, а також будь-які атрибути, пов'язані з цими елементами, крім того в схемах XDR визначаються взаємозв'язки елементів XML-документа.

Дуже важливо усвідомити той факт, що XDR-схеми є екземплярами XML, тобто вони складаються з елементів і атрибутів XML, а отже, вони перевіряються на відповідність іншій схемі. Тому, створюючи XML-документ згідно розробленій XDR-схемі, програміст має ще справу і з третім документом, що містить середовище для XDR-файла.

РОЗРОБЛЕННЯ XDR –СХЕМ

Ми вже знаємо як підключати внутрішні і зовнішні схеми DTD, знаємо всі переваги таких схем і їх недоліки. Розберемося з тим, як працюють XDR-схеми.

Перш за все, відзначимо, що XDR-схеми – зовнішні. Зв'язок XML - файлу з його XDR-схемою прописується як атрибут кореневого елемента. Наприклад,

1: <?xml version= ‘1.0’ encoding= ‘windows-1251’ ?>

2: <note xmlns=‘x-shemas:example_4.xdr’>

3: Завтра о 12.45 лекція з Web-дизайну

4: </note>.

Тут, в рядку 2 кореневий елемент note містить атрибут xmlns, який вказує, в якому файлі міститься відповідна XDR-схема.

ОГОЛОШЕННЯ ТИПУ ЕЛЕМЕНТА

Всі XDR-схеми описуються в окремому файлі, що має розширення *.xdr. Оскільки XDR-схема є XML-документом, то першим рядком є визначення документа

<? xml version= “1.0”?>,

далі йде опис кореневого елемента. Кореневий елемент завжди виглядає таким чином:

1: <Schema

2: name=“ім’я_схеми”

3: xmlns=“urn:schemas-microsoft-com: xml-data”

4: xmlns:dt=“urn:schemas-microsoft-com: datatypes”>

5: <!--Оголошення інших елементів -->

6: <ElementType />

7: <!--кінець списку оголошення елементів-->

8: </Schema>

У рядку 3 описується, на якому просторі імен базується опис елемента Schema. У рядку 4 оголошується простір імен для даних елемента Schema. Решта рядків (5-7) є рядками опису дочірніх елементів ElementType.

Опис елементів в XDR-схемах має такий синтаксис:

<ElementType

name= “idref”

сontent= “{empty|textOnly|eltOnly|mixed|}”

dt:type= “datatype”

model=“{open|closed}”

order=“{one|seq|many}” />

Тут кожен з атрибутів має значення, залежне від описуваного елемента

name – задає ім'я елемента

content– вказує на те, що містить описуваний елемент. Допустимими значеннями цього атрибута є:

-  empty – порожній елемент;

-  eltOnly – означає, що елемент може бути тільки контейнером для інших елементів;

-  textOnly – може містити тільки текст;

-  mixed – змішані дані (стандартне значення).

dt:type – оголошує тип даних елемента. Префікс дозволяє вказати простір імен для URI адрес.

model – дозволяє (open) або забороняє (closed) використовувати елементи, не визначені в схемі XDR.

order – оголошує порядок проходження дочірніх елементів екземпляра XML

-  one – припускає наявність одного елемента;

-  seq – указує елементи в строгому порядку;

-  many – припускає наявність будь-якої кількості елементів.

Наприклад, розглянемо схему schema_5.xdr, розроблену для XML-документа example_5.xml.

XDR-схема для example_5.xml буде такою:

1: <?xml version= “1.0”>

2: <Schema

3: name= “example_5”

4: xmlns=“urn:shemas-microsoft-com: xml-data”

5: xmlns:dt=“urn:shemas-microsoft-com: datatypes”>

6: <ElementType name=“note” model= “closed” content = “textOnly” dt:type= “string”/>

7: </Schema>

У даній схемі дескриптор <Schema>, що відкривається, містить три атрибути. Атрибуту name (рядок 3) привласнено ім'я документа, для якого призначається схема, що розробляється.

У рядку 4 визначається стандартний простір імен для схеми XDR.

У рядку 5 визначається простір імен для типів даних, оголошених у схемі.

Рядок 6 детальніше описує елемент: ім'я, заборона використання неописаних в схемі елементів, вміст – лише текст, тип даних може бути тільки строковий.

ОГОЛОШЕННЯ ElementType ВКЛАДЕНИХ ЕЛЕМЕНТІВ

Точно так, як і в схемах DTD, XDR-схеми можуть описувати вкладені елементи. Опис вкладених елементів відбувається за правилом.

< ElementType name= ‘.’ >

<element type= ‘ім'я вкладеного елемента’>
</ElementType >

</ElementType name= ‘ім'я вкладеного елемента’ / >

Наприклад, для XML-документа example_6.xml:

<?xml version=“1.0” encoding= “windows-1251”?>

<note xmlns=‘x-shemas:example_6.xdr’>

<text>Завтра о 12.45 лекція з Web-дизайну

</text>

</note>,

де елемент <note> має дочірній елемент text, XDR-схема виглядатиме так:

1: <?xml version= ‘1.0’?>

2: <Schema

3: name= ‘example_6’

4: xmlns= ‘urn: shemas-microsoft-com: xml – data’

5: xmlns:dt=‘urn: shemas-microsoft-com: datatypes’>

6: <ElementType name= ‘note’ model= ‘closed’ content=‘eltOnly’>

7: <element name= ‘text’/>

8: </ElementType>

9: <ElementType name=‘text’ model= ‘closed’ content=‘textOnly’ dt:type=‘string’/>

10: </Schema>.

Необхідно звернути увагу на те, що елемент text у схемі згаданий двічі. Перший раз описаний у рядку 7, як дочірній елемент елемента note, другий, – повністю визначається в рядку 9.

Як дочірні елементи для елемента ElementType можуть бути такі елементи:

Element – оголошує дочірній елемент

Description – забезпечує опис ElementType елемента

Datatype – визначає тип даних ElementType елемента

Group – визначає порядок проходження елемента

Attribute Type – визначає атрибут

Attribute – визначає відомості про дочірній елемент Attribute Type.

У разі розроблення XDR-схеми для елемента, що містить декілька пустих елементів, використовують наступний підхід.

Схема складена для прикладу example_7.xml:

<?xml version= “1.0” encoding= “windows-1251” ?>

<note xmlns= ‘x-shemas:example_7.xdr’>

<time />

<date />

<text>Завтра о 12.45 лекція з Web-дизайну

</text>

</note>.

XDR-схема example_7.xdr для XML-файлу example_7.xml.

1: <?xml version= ‘1.0’>

2: <Schema

3: name= ‘example_7’

4: xmlns= ‘urn: shemas-microsoft-com: xml – data’

5: xmlns:dt= ‘urn:shemas-microsoft-com: datatypes’>

6: <ElementType name=‘note’ model=‘closed’ content=‘eltOnly’>

7: <element name= ‘time’/>

8: <element name= ‘date’/>

9: <element name= ‘text’/>

10: </ElementType>

11: <ElementType name= ‘time’ model= ‘closed’ content= ‘empty’ />

12: <ElementType name= ‘data’ model= ‘closed’ content= ‘empty’ />

13: <ElementType name= ‘text’ model= ‘closed’ content= ‘textOnly’ dt:type= ‘string’/>

14: </Schema>

Внесення пустих дочірніх елементів в якості атрибутів елементів більш високого рівня, вважається прикладом гарного програмування.

Так, у попередньому прикладі порожніми елементами були time і data. Перенесемо їх у XML-документ як атрибути елемента note.

example_8.xml

1: <?xml version= “1.0” encoding= “windows-1251” ?>

2: <note xmlns= ‘x-shemas:example_8.xdr’

3: time= ’12:54:13’

4: date= ’’>

5: <text>

6: Завтра о 12.45 лекція з Web-дизайну

7: </text>

8: </note>

З появою атрибутів у елементі виникає необхідність використання в XDR-схемі елемента AttributeType.

ЕЛЕМЕНТ AttributeType

Синтаксис визначення елемента AttributeType має вигляд:

<AttributeType

default=‘default-value’

dt:type=‘primitiv-type’

dt:values=‘enumerated-values’

name=‘idref’

required=‘{yes|no}’>.

Тут

default – значення атрибута за замовчанням. Наприклад, якщо атрибут відноситься до переліченого типу, значення за замовчанням повинне вказуватися у списку;

dt:type – тип даних для атрибута певного типу: entity, entities, enumeration, id, idref, idrefs, nmtoken, nmtokens, notation, string. При обраному типі enumeration необхідно вказувати і атрибут dt:values;

dt:values – містить всі допустимі значення, якщо dt:type=‘enumeration’;

name – ім'я типу атрибута. Цей атрибут обов'язковий;

required – указує на необов'язкову наявність атрибута в описі елемента.

У даному прикладі атрибут відноситься до елемента note. Тому ElementType для елемента note міститиме і елементи, і AttributeType, і Attribute.

Розглянемо синтаксис елемента Attribute.

<Attribute

default=‘default-value’

type=‘attribute-type’

required= ‘{yes|no}’>.

Тут

default – значення атрибута за замовчанням. Має перевагу перед будь-яким значенням за замовчанням, вказаним в елементі AttributeType;

type – ім'я елемента AttributeType, яке визначене в даній схемі (або в іншій, вказане за допомогою відповідного простору імен). Вказане значення повинне відповідати значенню атрибута name в AttributeType;

required – вказує на необов'язкову наявність атрибута в описі елемента. Необов'язковий, якщо необхідний атрибут присутній в AttributeType.

Таким чином, для прикладу example_8.xml XDR-схема буде мати такий вигляд:

1: <?xml version= '1.0' ?>

2: <Schema

3: name='example_8'

4: xmlns= 'urn:shemas-microsoft-com:xml-data'

5: xmlns:dt='urt:shemas-microsoft-com:datatype'>

6: <ElementType name='note' content='eltOnly' model='close' >

7: <AttributeType

8: dt:type='time'

9: name= 'time'

10: required='yes'/>

11: <Attribute

12: type= 'time'

13: required='yes'/>

14: <AttributeType

15: dt:type='date'

16: name= 'date'

17: required= 'yes'/>

18: <Attribute

19: type= 'date'

20: required= 'yes'/>

21: <element name = 'text'/>

22: </ElementType>

23: <ElementType name='text content='textOnly' model='close'/>

24: </Schema>.

Якщо в рядку

4: date= ’’

прикладу example_8.xml внести зміни

4: date= ’17 жовтня 2009’

валідатор при перевірці XML-документа повідомить про помилку «невідповідність типів даних».

ТИПИ ДАНИХ У XDR-СХЕМАХ

bin. base64

–  двійкові дані з використанням шифрування MIME;

bin. hex

–  визначає двійкові дані в шістнадцятиричному форматі;

boolean

–  0 або 1;

char

–  символ (рядок, що складається з одного символу);

date

–  указує на дату без часу у форматі ISO-8601, наприклад, . Проте правильність зазначення дати не перевіряється, тобто допустиме значення і дати ;

dataTime

–  вказує дату (вказівка часу необов'язкова) в підмножині формату ISO-8601, наприклад, T09:57:12;

dataTime. tz

–  вказує дату (вказівка часу і часового поясу необов'язково) в підмножині формату ISO-8601. Наприклад, T09:57:12-02:00;

fixed.14.4

–  визначає десяткове число, що містить не більше 14 знаків зліва і не більше 4 цифр праворуч від десяткової крапки;

float

–  визначає дійсне число (без обмежень на кількість цифр), може містити знак дробу, а також показник ступеня, значення від 1.797693E+308 до 2.22507Е-308;

int

–  ціле число з необов'язковим знаком;

number

–  визначає число без обмеження цифр, може містити знак дробу і ступінь значення від 1.797693E+Е-308;

time

–  вказує час без дати і часового поясу в підмножині формату ISO – 8601, наприклад, 10:14:51;

time. tz

–  вказує час і часовий пояс, наприклад, 10:14:51+02:00;

i1

–  визначає ціле число, представлене одним байтом (1-128). Дробові знаки і знаки піднесення до ступеня не допускаються;

i2

–  визначає ціле число, представлене одним словом (1-32768);

i4

–  визначає ціле число, представлене чотирма байтами (1-1;

i8

–  визначає ціле число, представлене вісьма байтами;

r4

–  дійсне число з точністю 7 цифр. Може містити знак, дробову частку необов'язковий знак ступеня;

r8

–  дійсне число з точністю 15 цифр;

ui1

–  ціле число без знаку, дробової частки або ступеня;

ui2

–  ціле число, що складається з 2 байтів, без знаку, дробової частки або ступеня;

ui4

–  ціле число, що складається з 4 байтів, без знаку, дробової частки або ступеня;

ui8

–  ціле число, що складається з 8 байтів, без знаку, дробової частки або ступеня;

uri

–  уніфікований індикатор ресурсу URI, наприклад, urn: schemas-microsoft-com:Office 9.0;

uuid

–  шістнадцятиричне число, розбите на октети, містить необов'язкові перенесення, які ігноруються, наприклад, 345FFD3A1-F501-FA33-12-ADFFD3A1.

ІНДИКАТОРИ ВХОДЖЕННЯ В XDR-СХЕМАХ

У XDR-схемах необхідно указувати скільки разів дочірній елемент може зустрічатися в батьківському елементі. Для цього в описі дочірнього елемента element використовують атрибути minOccur і maxOccur.

Повний синтаксис елемента такий:

<element

type= ’тип_елемента’

minOccur = ’{0|1}’

maxOccur=’{1|*}’ />.

За замовчанням обидва атрибути і minOccur, і maxOccur набувають значення 1.

Для демонстрації роботи атрибутів minOccur і maxOccur елемента element внесемо до XML-документ example_8.xml зміни, повторивши використання елемента text кілька разів. Валідатор тут же відреагує на невідповідність XML-даних XDR-схеми, вказаній в рядку 2.

example_9.xml

1:<?xml version= “1.0” encoding= “windows-1251”?>

2: <note xmlns=‘x-shemas:example_8.xdr’

3: time= ’12:54:13’

4: date= ’’>

5: <text>

6:18.10.2009 у 12.45 лекція з Web-дизайну

7: </text>

8: <text>

9: 18.10.2009 о 13.25 практика з Web-дизайну

10: </text>

11: <text>

12:20.10.2009 знову о 12.45 лекція з Web-дизайну

13: </text>

14: </note>

Для того, щоб уникнути подібних помилок змінимо XDR-схему.

example_9.xdr

1: <?xml version='1.0' ?>

2: <Schema

3: name='example_8'

4: xmlns='urn:shemas-microsoft-com:xml-data'

5:xmlns:dt='urt:shemas-microsoft-com: datatype'>

6: <ElementType name='note' content= 'eltOnly' model='close' >

7: <AttributeType

8: dt:type='time'

9: name='time'

10: required= 'yes'/>

11: <Attribute

12: type='time'

13: required='yes'/>

14: <AttributeType

15: dt:type='date'

16: name='date'

17: required= 'yes'/>

18: <Attribute

19: type= 'date'

20: required='yes'/>

21: <element name='text' minOccur=’1’ maxOccur=’*’ />

22: </ElementType>

23: <ElementType name='text' content='textOnly' model='close'/>

24: </Schema>

ДОДАТКОВІ ОБМЕЖЕННЯ ТИПІВ ДАНИХ

У XDR-СХЕМАХ

Наприклад, інколи при обробці типу даних string, досить використовувати рядки визначеної довжини. Але сам тип припускає необмежену довжину, тому виникає необхідність штучно обмежити довжину даних. Така ж ситуація може виникнути і у випадку з іншими типами, такими як number, bin. hex, bin. base64.

Для таких випадків були введені додаткові атрибути елемента AttributeType, при цьому використовується такий синтаксис:

<AttributeType

name=’idref’

dt:type=’string|number|bin. hex|bin. base64}

recuired=’{yes|no}’

dt:minLenght=’додатне ціле число’ dt:mаxLenght=додатнє ціле число’ />

ВИКОРИСТАННЯ ГРУП ВМІСТУ

В електронній комерції часто виникають ситуації, коли при перевірці яких-небудь даних може виникнути помилка, тому відкидається цілий документ. Але замість того, щоб відхилити цілу транзакцію, користувачеві пропонують змінити тільки той блок коду, який не пройшов верифікації.

Наприклад, необхідно отримувати відомості про те, що повідомлення було отримане повністю. Крім того, необхідно, щоб додаток перевіряв екземпляр XML так, щоб у ньому була потрібна наявність того або іншого повідомлення.

Нехай маємо XML-документ example_10.xml

<?xml version="1.0" encoding= "windows-1251" ?>

<note>

<text

time=’12:15:45’

date=’’

number=’n1’

from=’’>

Завтра лекція з Web-дизайну о 13.25

</text>

<text

time=’14:45:15’

date=’’

number="n2"

from="Керівник відділу"> Терміново здати звіт</text></note>.

Введемо після кожного елемента text новий елемент <report>, у рамках цього елемента розглянемо дочірній порожній елемент <complete> або <incomplete> .

У результаті отримаємо example_10.xml

<?xml version= "1.0" encoding="windows-1251" ?>

<note>

<text

time=’12:15:45’

date=’’

number=’n1’

from=’’>

Завтра лекція з Web-дизайну о 13.25

</text>

<report> <complete /></report>

<text

time=’14:45:15’

date=’’

number=’n2’

from=’Керівник відділу’>

Терміново здати звіт

</text>

<report>

<incomplete />

</report>

</note>.

Для перевірки цього документа створимо групу змісту в схемі XDR, що містить елементи <complete> і <incomplete>.

Групи змісту створюються завдяки елементу XDR-схеми <group>, який є дочірнім у батьківському елементі ElementType.

Синтаксис елемента <group>:

<group order=’{one|seq|many}’ minOccur=’{0|1}’ maxOccur=’{1|*}’>

<element type=’ElementType’>

<element| type=’ElementType’>

</group>.

У даному випадку, фрагмент XDR-схеми буде мати такий вигляд:

<group

order=’one’

<element type=’incomplete’>

<element type=’complete’>

</group>.

Повна схема XDR виглядатиме так:

1: <?xml version= '1.0' ?>

2: <Schema

3: name= 'example_10'

4: xmlns= 'urn:shemas-microsoft-com:xml-data'

5: xmlns:dt='urt:shemas-microsoft-com: datatype'>

6: <ElementType

7: name='note'

8: content='eltOnly'

9: model='close'

10: order=’many’>

11: <element

12: type=’text’

13: minOccure=’1’

14: maxOccure=’*’ / >

15: <element

16: type=’report’ / >

17: </ElementType>

18: <ElementType

19: name=’incomplete’

20: model=’close’

21: content=’empty’/>

22:

23: <ElementType

24: name=’complete’

25: model=’close’

26: content=’empty’/>

27:

28: <ElementType

29: name=’text’

30: model=’close’

31: content=’textOnly’/>

32:

33: <AttributeType

34: dt:type= 'time'

35: name= 'time'

36: required= 'yes'/>

37: <Attribute

38: type= 'time'

39: required= 'yes'/>

40: <AttributeType

41: dt:type= 'date'

42: name= 'date'

43: required= 'yes'/>

44: <Attribute

45: type= 'date'

46: required= 'yes'/>

47: <AttributeType

48: name= 'date'

49: dt:type= 'string'

50 dt:maxLength=’15’

50: required= 'yes'/>

51: <Attribute

52: type= 'from'

53: required= 'yes'/>

54: </ElementType>

55: <ElementType name=’report’ model=’close’ content=’eltOnly’>

56: <group order=’one’>

57: <element type=’complete’/>

58: <element type=’incomplete’/>

59: </group>

60: </ElementType>

61: </Schema>.

Розділ 4 МОВА ВИЗНАЧЕННЯ СХЕМ XML ( XSD)

Основні риси мови визначення схем xml (xsd)

Мова XML Schema Definition Language, яку також називають XML Schema Language, багато в чому схожа на мову XDR, з якою ви познайомилися раніше. Схеми XSD здатні розв’язувати такі задачі:

-  Перелічення елементів у документі XML і перевірка наявності в документі тільки оголошених елементів.

-  Оголошення і визначення атрибутів, що модифікують елементи документа.

-  Визначення батьківсько-дочірніх стосунків між елементами.

-  Визначення станів і моделей вмісту для елементів і атрибутів.

-  Завдання типів даних.

-  Установка значень за замовчанням.

-  Можливість розширення.

-  Підтримка використання просторів імен.

Усі схеми, незалежно від використовуваних для їх створення словників і синтаксичних правил, призначені для задання певних обмежень на документи XML, а отже, для забезпечення відповідності останніх певним правилам. Мови опису схем, які базуються на синтаксисі XML, володіють певними перевагами перед DTD, оскільки допускають розширення використовуваних дескрипторів розмітки, а також перевірку документів і схем за допомогою стандартного синтаксичного аналізатора XML.

У схемах XSD дескриптори, що використовуються в документах XML, розділяються на дві категорії :

– складні типи. Елементи складних типів можуть містити інші елементи, а також володіють певними атрибутами, тобто мати змішаний вміст;

– прості типи.

Наприклад, до простого типу можна віднести дескриптор

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6