Лекція Створення валідних XML-документів

Завдання дочірнього вмісту елемента

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

Розглянемо наступний приклад документа XML, який описує одну книгу:

The Scarlet Letter

Модель вмісту може мати одну з таких основних форм.

  • Послідовна. Послідовна форма моделі вмісту вказує на те, що елемент повинен мати задану послідовність дочірніх елементів. Ви відокремлюєте імена типів дочірніх елементів комами. Наприклад, наступне DTD вказує, що елемент MOUNTAIN повинен мати один дочірній елемент NAME, після якого йде один дочірній елемент HEIGHT, за яким слідує один дочірній елемент STATE:

Отже, наступний елемент Документ буде валідним:

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

  • Вибіркова. Вибіркова форма моделі вмісту вказує на те, що елемент може мати будь-який із серії допустимих дочірніх елементів, що розділяються символом . Наприклад, наступне DTD вказує, що елемент FILM може складатися з одного дочірнього елемента STAR або одного дочірнього елемента NARRATOR, або одного дочірнього елемента INSTRUCTOR:

Отже, наступний елемент Документ буде валідним:

Sir Gregory Parsloe

а також елемент:

Документ не буде валідним,оскільки ви можете включити лише один із дочірніх елементів:

Sir Gregory Parsloe

Ви можете змінити будь-яку з цих форм моделі вмісту, використовуючи символи: знак питання (?), знак плюс (+) та зірочка (*), значення яких описані в наступній таблиці:

Таким чином, наступний елемент буде правильним:

Відповідно, кожен із наступних трьох елементів буде коректним:

Sir Gregory Parsloe

Нарешті, ви можете формувати складніші моделі вмісту шляхом вкладення вибіркової моделі вмісту всередину послідовної моделі, або послідовної моделі у вибіркову модель. Наприклад, наступне DTD задає, кожен елемент FILM повинен мати один дочірній елемент TITLE; за ним повинен слідувати один дочірній елемент CLASS; після нього має йти один дочірній елемент STAR, NARRATOR чи INSTRUCTOR:

Відповідно до цього DTD, наступний елемент Документ буде коректним:

так само, як такий:

Тип атрибуту

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

Мал. 5.4.

Ви можете задавати тип атрибута трьома різними способами.

  • Рядковий тип. Строковий тип атрибуту може бути призначений будь-якому рядку в лапках (літералу), який відповідає загальним правилам, описаним у розділі "Правила для коректного завдання значень атрибутів" у лекції 3. Ви повинні оголосити рядковий тип атрибута з використанням ключового слова CDATA, як це зроблено для визначення атрибуту Class у наступному прикладі:
  • Тип маркеру. Значення, які можна надавати атрибуту маркерного типу, мають ряд обмежень (див. наступнийрозділ).
  • Нумерований тип. Для нумерованого типу атрибута можна надавати одне значення або список певних значень. Про цей тип ви дізнаєтеся у розділі "Завдання нумерованих типів" далі у цій лекції.

Завдання маркерного типу

Як і будь-яке значення атрибута, значення, яке ви надаєте маркерному типу атрибута, повинно бути рядком у лапках, що відповідає загальним правилам, описаним у розділі "Правила для коректного завдання значень атрибутів" у лекції 3.

]> Peach Tea Pot Electric Coffee Grinder Candy Thermometer

Нижче наведено повний список ключових слів, які можна використовувати у визначенні маркерних типів атрибутів, та обмеження, які вони накладають на значення атрибутів.

Далі можна використовувати цей атрибут для посилання на інший елемент ITEM:

Electric Coffee Grinder Coffee Grinder Brush

  • IDREFS. Цей тип атрибута схожий на тип IDREF, але при цьому значення може включати посилання на кілька ідентифікаторів – розділених пробілами – всередині рядка в лапках. Наприклад, якщо ви призначите атрибуту GoesWith тип IDREFS таким чином:

то можете використовувати його на посилання на кілька інших елементів:

Electric Coffee Grinder 1 pound Breakfast Blend Coffee Beans Coffee Grinder Brush

  • ENTITY. Значення атрибута має збігатися з ім'ям примітиву, оголошеного DTD. Цей примітив не обробляється синтаксичним аналізатором і посилається на зовнішній файл, який зазвичай не містить XML-дані. Про такі примітиви буде розказано у лекції 6.

Наприклад, в DTD ви оголошуєте елемент з ім'ям IMAGE, що представляє графічне зображення, атрибут типу ENTITY з ім'ям Source, що вказує на джерело графічних даних:

Якщо ви оголосили не аналізований примітив з ім'ям Logo (використовуючи техніку, з якою ви познайомитеся в лекції 6), який містить графічні дані для зображення, ви можете привласнити цей примітив атрибуту Source елемента IMAGE в документі таким чином:

  • ENTITIES. Цей тип атрибута схожий на тип ENTITY, за винятком того, що значення може містити імена кількох примітивів, що не аналізуються, – розділених пробілами – всередині рядка в лапках. Наприклад, якщо ви призначили атрибуту Source тип ENTITIES так:

то зможете використовувати його для посилання на кілька не аналізованих примітивів (припустимо, примітивів, що містять графічні дані в альтернативних форматах), наприклад:

(Тут мається на увазі, що LogoGif і LogoBmp - імена не аналізованих примітивів, які були оголошені в DTD за допомогою прийомів, з якими ви познайомитеся в лекції 6.)

  • NMTOKEN. Це значення є елементарне ім'я (name token), що є ім'ям, що складається з однієї або більше літер, цифр, точок (.), тире (–) або символів підкреслення (_). Елементарне ім'я може також містити двокрапку (:), але не першому місці. Наприклад, якщо ви призначите атрибуту ISBN тип NMTOKEN наступним чином:

то можете привласнити йому значення, що починається з цифри (цифри як перші символи допустимі для типів NMTOKEN і NMTOKENS, але не будь-яких інших маркерних типів):

The Portrait of a Lady

  • NMTOKENS. Цей тип атрибута схожий на тип NMTOKEN, але значення може містити кілька елементарних імен – розділених пробілами – всередині рядка в лапках. Наприклад, якщо ви призначите атрибуту Codes тип NMTOKENS наступним чином:

ви можете надати йому кілька значень у виглядіелементарних імен:

long sleeve Henley

Завдання нумерованих типів

Як будь-яке значення атрибута, значення, яке ви надаєте нумерованому типу, повинно бути рядком у лапках, що відповідає правилам, описаним у розділі "Правила для коректного завдання значень атрибутів" у лекції 3. Крім цього, значення має збігатися з одним з імен, наведених у списку типів атрибутів. Ці імена можуть мати одну з двох форм запису.

  • Відкриваюча дужка, за якою йде список елементарних імен, розділених символами , після чого слідує дужка, що закриває. Нагадаємо, що елементарне ім'я – це ім'я, що складається з однієї або декількох літер, цифр, точок (.), тире (–) або символів підкреслення (_), а також може включати одну двокрапку (:), але не на першому місці. Наприклад, якщо ви хочете обмежити значення атрибуту Class словами "fictional", "instructional" або "documentary", то можете визначити цей атрибут як нумерований тип так:

Ось закінчений XML-документ, що демонструє використання атрибуту Class:

]> The Use and Care of XML Michael Young

Якщо ви опустили атрибут Class, йому буде за промовчанням присвоєно значення "fictional". Присвоєння атрибуту Class значення, відмінного від "fictional", "instructional" або "documentary", призведе до помилки.

  • Ключове слово NOTATION, за яким йде пробіл, потім відкриває дужка, потім список імен нотацій, що розділяються символами , після чого слідує дужка, що закриває. Кожне з цих імен має точно відповідати імені нотації, оголошеному DTD. Нотація описує формат даних або ідентифікує програму, що застосовується для обробки певного формату (докладніше про нотації буде розказано влекції 6).

Надалі можна використовувати елемент Format для вказівки формату певного елемента EXAMPLE_DOCUMENT, як у наведеному нижче прикладі:

Mike’s Home Page

Присвоєння атрибуту формату значення, відмінного від "HTML", "SGML" або "RTF", призведе до помилки. (Зверніть увагу на використання тут розділу CDATA – при цьому ви можете вільно використовувати символ лівої кутової дужки (