9.2. Правила створення xml-документа
Особливістю XML-документів є наявність встановлених строгих правил, яким повинен XML-документ: Специфікація XML вимагає, щоб парсер відбраковував будь-який XML-документ, в якому не витримано основних правил. Створені ці правила навмисно, щоб обійти неоднозначність, що виникає в погано структурованих HTML-документах, недбала розмітка яких приймається більшістю парсерів.
Парсер - це частина програмного коду, яка намагається прочитати документ і інтерпретувати його вміст.
В загальному випадку XML-документи повинні задовольняти наступним вимогам:
Кожний відкриваючий тег, що визначає деяку частину даних в документі, обов'язково повинен супроводитися закриваючим (тобто, на відміну від HTML, не можна опускати закриваючі тэги).
Вкладеність тэгов в XML строго контролюється, тому необхідно стежити за порядком проходження відкриваючих і закриваючих тэгов.
В XML враховується регістр символів.
Вся інформація, розташована між початковим і кінцевим тегами, розглядається в XML як дані, і тому враховуються всі символи форматування (тобто пропуски, переклади рядків, табуляції не ігноруються, як в HTML).
Кожний XML-документ повинен мати унікальний кореневий елемент. В нашому прикладі таким елементом є елемент <address>.
Всі значення атрибутів, що використовуються у визначенні тэгов, повинні бути укладений в лапки.
Якщо XML-документ не порушує приведені вище правила, то він називається формально-правильним.
9.3. Аналіз xml-документів
Отримання даних з XML-документа, а також перевірка коректності XML-документів забезпечується аналізаторами (parsers) XML-документів. Якщо XML-документ є формально-правильним, то всі аналізатори, що призначені для опрацювання XML-документів, зможуть працювати з ним коректно.
XML-аналізатори дозволяють у випадку якщо задані в документі конструкції мови є синтаксично коректними, правильно витягувати визначувані ними елементи документа і передавати їх прикладній програмі, що виконує необхідні дії по відображенню. Тобто після розбору XML-документа в більшості випадків, прикладній програмі надається об'єктна модель, що відображає вміст отриманого XML-документа, і засоби, необхідні для роботи з нею (проходу по дереву елементів).
Прикладом XML-аналізатора може служити вбудований в Microsoft Internet Explorer версії 5.0 XML-аналізатор MSXML. Він дозволяє читати дані з XML-файлу, обробляти їх, генерувати дерево елементів, відображати дані з використанням стильових таблиць XSL, а також, використовуючи DOM, представляти всі елементи даних у вигляді об'єктів.
На сьогоднішній день існує два способи контролю правильності XML-документа і визначення елементів, які використовуються для представлення даних:
DTD-визначення (Document Type Definition – Визначення Типу Документа). DTD визначає елементи, які можуть з'являтися в XML-документі, порядок, в якому вони можуть з'являтися, як вони можуть бути вкладені один в одного і інші основні деталі структури XML-документа. DTD є частиною початкової специфікації XML і вони дуже схожі на DTD в SGML;.
схеми даних (Semantic Schema, XML Schema, схема XML). Схема може визначити все те в структурі документа, що вміщується в DTD, і може також визначити типи даних і складніші правила, чим DTD. W3C розробила специфікацію XML Schema через пару років після початкової специфікації XML.
Якщо XML-документ створюється і пересилається з використанням DTD-описів або схем (Schemas), то він називається валідним (правильним). XML-документ, якій відповідає правилам опису даних, але не мають DTD або схеми називається правильно-форматованим. Неправильними є XML-документи, в яких не дотримуються синтаксичних правил, визначених у специфікації XML.
Рис. . Перевірка документа XML на основі DTD або Schemas
DTD. Синтаксис DTD своєрідний і потребує додаткових зусилль при створенні таких документів (складність DTD є однією з причин того, що використовування SGML, вимагаючого визначення DTD для будь-якого документа, не отримало такого широкого розповсюдження як, наприклад, HTML).
В правилах DTD описуються елементи і їх допустимий вміст, атрибути і їх допустимі значення. Наприклад, при описі за допомогою DTD повинен бути заданий тип документа, задані елементи і їх допустимі атрибути:
В XML використовувати DTD не обов'язково - документи, створені без цих правил, правильно оброблятимуться програмою-аналізатором, якщо вони задовольняють основним вимогам синтаксису XML. Проте контроль за типами елементів і коректністю відносин між ними в цьому випадку повністю покладатиметься на автора документа.
В DTD для XML використовуються наступні типи правил:
правила для елементів і їх атрибутів;
опису категорій (макроозначень);
опис форматів бінарних даних.
Всі вони описують основні конструкції мови - елементи, атрибути, символьні константи зовнішні файли бінарних даних.
DTD дозволяє вам задати основну структуру XML-документа.
<!-- address.dtd -->
<!ELEMENT address (name, street, city, state, postal-code)>
<!ELEMENT name (title? first-name, last-name)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT postal-code (#PCDATA)>
Цей DTD визначає всі елементи, використовувані в прикладі документа. Воно визначає три основні речі:
Елемент <address> містить <name>, <street>, <city>, <state> і <postal-code>. Всі ці елементи повинні бути присутніми і саме в такому порядку.
Елемент <name> містить необов'язковий елемент <title> (знак питання означає, що <title> є необов'язковим), за яким слідує елемент <first-name> і елемент <last-name>.
Всі інші елементи містять текст. (#PCDATA позначає розбирані символьні дані; ви не можете включати інші елементи в ці елементи.)
Хоча DTD простий, він прояснює, які комбінації елементів є допустимими. Документ адреси, яка має елемент <postal-code> перед елементом <state>, не є правильним, як і документ, який не має елементу <last-name>.
Символи в DTD. Є декілька символів, використовуваних в DTD для індикації того, як часто (або коли) що-небудь може з'являтися в XML-документі:
Кома показує список обов’язкових елементів.
Знак питання показує, що елемент є необов'язковим; він може з'являтися один раз або не з'являтися взагалі.
Знак плюс показує, що елемент з'являється хоч би один раз, але може з'являтися і скільки завгодно раз.
Зірочка показує, що елемент може з'являтися скільки завгодно раз, включаючи нуль.
Вертикальна межа показує список варіантів; ви можете вибрати тільки один елемент із списку.
Визначення атрибутів. За допомогою DTD ви можете визначити атрибути для елементів, що з'являються у вашому XML-документі, а також:
Визначити, які атрибути є обов'язковими
Визначити значення за умовчанням для даного атрибуту
Перерахувати допустимі значення для даного атрибуту
Схема даних це спосіб створення правил побудови XML-документів, тобто завдання допустимих імен, типів, атрибутів і відносин елементів в XML-документі. Схеми є альтернативним способом створення правил побудови XML-документів. В порівнянні з DTD-описами, схеми володіють більш могутніми засобами для визначення складних структур даних, забезпечують більш зрозумілий спосіб опису граматики мови, здатні легко модернізуватися і розширятися. Безумовною гідністю схем є також те, що вони дозволяють описувати правила для XML-документа засобами самого ж XML. З цієї точки зору мову XML можна назвати тим, що самоописується.
Схеми XML мають декілька переваг в порівнянні з DTD:
Схеми XML використовують синтаксис XML. Іншими словами, схема XML є XML-документом. Це означає, що ви можете обробляти схему так само, як і будь-який інший документ. Наприклад, ви можете написати таблицю стилів XSLT, яка перетворить схему XML Web-форму разом з автоматичною генерацією коду JavaScript, який перевірятиме дані у міру їх введення.
Схеми XML підтримують типи даних. Хоча DTD виконує підтримку типів даних, воно розглядає ці типи даних тільки з погляду публікації. Схеми XML підтримують всі початкові типи даних DTD (такі, як ID і посилання ID). Вони також підтримують цілі і дійсні числа, дати і часи, рядки, URL і інші типи даних, корисні для обробки і перевірки даних.
Схеми XML є розширюваними. Окрім типів даних, визначених в специфікації XML schema, ви можете також створювати власні типи і можете створювати типи-спадкоємці на базі інших типів даних.
Схеми XML мають могутніші вирази. Наприклад, за допомогою схем XML ви можете визначити, що будь-яке значення атрибуту <state> не може бути довше двох символів або що будь-яке значення елементу <postal-code> повинно відповідати регулярному виразу [0-9]{5}(-[0-9]{4})?.
Проте це не означає, що схеми можуть повністю замінити DTD- описи - цей спосіб визначення граматики мови використовується зараз практичними всіма верифікуючими аналізаторами XML і, більш того, самі схеми, як звичайні XML-елементи, теж описуються DTD. Але серйозні можливості нової мови і його відносна простота, безумовно, дають підстави стверджувати, що майбутній стандарт знайде широке застосування як зручного і ефективного засобу перевірки коректності складання документів.
При описі за допомогою схем файл опису граматики XML в самому найпростішому випадку може бути виглядати так:
<?xml version="1.0" encoding="Windows-1251"?> <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <AttributeType name="id" required="no dt":type="string"/> <ElementType name="title dt":type="string"> </ElementType> <ElementType name="part"> <attribute type="id"/> <element type="title"/> </ElementType> <Element Type name="picture dt":type="string"></ElementType> <ElementType name="article"> <element type="part"/> <element type="picture"/> </ElementType> <ElementType name="Book"> <element type="article"/></ElementType> </Schema>
В даній схемі документа визначається головний документ Book, який містить елементи article. Елемент article містить елементи part і picture. Для елемента part описаний атрибут id, якою повинен бути типу string і є необов'язковим. Якщо при перевірці на основі схем або DTD виявлена помилка, то в програму або броузер повідомляється і її типі, місці і коді. Використовування схем правил, дозволяє задати практично будь-яку граматику, яка піддається формалізованій обробці. Відзначу, що і схеми даних можна побудувати в програмі, тобто ми дістаємо можливість генерації схеми мови і виконання автоматизовану синтаксичну і семантичну перевірку документів XML на їх основі.