Уявіть собі універсальну «мову-зв'язку», яка дозволяє зберігати, обмінюватися та структурувати дані між системами та людьми — від наочних рецептів до складних технічних специфікацій. Це не фантазія, а реальність: XML — потужна і гнучка мова розмітки, яка залишається опорою для безлічі форматів та інтеграцій у Інтернеті та корпоративних рішеннях.
Мова XML
XML (від англ. eXtensible Markup Language) — це «розширювана мова розмітки», розроблена та рекомендована Консорціумом Всесвітньої павутини (W3C). Специфікація описує синтаксис документів та висуває вимоги до обробників, які читають та інтерпретують XML – від простих парсерів до повноцінних процесорів. Головна ідея XML — поєднання суворого формального синтаксису та зручності читання для людини, що робить його придатним і для машинної, і для ручної обробки.
Чому XML називають «розширюваним»
XML не нав'язує фіксований набір тегів: розробник сам визначає розмітку під потреби предметної області. Набір конкретних тегів та атрибутів, а також правила вкладеності та допустимих зв'язків утворюють так зване розширення — граматику на базі XML (наприклад, DTD, XML Schema або власні словники тегів). Завдяки цьому з'явилися десятки спеціалізованих форматів на базі XML: від конфігурацій програм до форматів обміну даними та діаграм.
Фізична та логічна структура документа
Специфікація поділяє подання документа на фізичну та логічну структуру. Це допомагає зрозуміти, як саме парсер «бачить» документ і які конструкти він опрацьовує.
Фізична структура
З фізичної точки зору документ складається з сутностей (entities) — іменованих блоків, вміст яких є послідовністю символів. Найвища сутність - документна сутність (корінь). Складові сутності можуть посилатися друг на друга; всі вони мають імена (за винятком деяких спеціальних сутностей).
Логічна структура
Логічна структура описує складові частини документа: пролог, кореневий елемент, елементи, оголошення, інструкції обробки, посилання на сутність та коментарі. Все це організовано за допомогою розмітки та визначає семантику документа XML.
Основні елементи логічної структури
- Пролог — необов'язкова частина, де можуть розташовуватися XML-декларація, оголошення типу документа та коментарі;
- Кореневий елемент є обов'язковим для коректного документа; охоплює весь вміст;
- Вкладені елементи — елементи можуть містити інші елементи, текст та коментарі;
- Атрибути — пари «ім'я-значення», пов'язані з елементами.
Символи розмітки
Розмітка XML завжди відкривається символом < і закривається символом >. Додаткова роль належить символу &, який вводить посилання на сутність або спеціальну сутність для заміни символів, неприпустимих у тексті.
Вирішення проблеми неоднозначності розмітки
Щоб парсер не плутав символи розмітки зі звичайним текстом, <, > і & не можна вставляти прямо у символьні дані або значення атрибута: для цього використовуються визначені сутності. Аналогічно, лапки та апострофи всередині атрибутів замінюються на відповідні сутності.
| Символ | Сутність-заміна | Примітка |
|---|---|---|
| < | < | Кутова дужка, що відкриває |
| > | > | Кутова дужка, що закриває |
| & | & | Амперсанд – вводить сутності |
| ' | ' | Апостроф у значенні атрибуту |
| " | " | Кимка у значенні атрибуту |
Кількісні посилання на символи
Для позначення символів за їх кодовими позиціями використовуються числові посилання двох форм: десяткова &#D; і шістнадцяткова &#xH;. Це корисно, якщо необхідно вставити символи, які не відображаються безпосередньо у вибраному кодуванні документа.
- å — десяткова форма для латинської літери з діакритикою;
- å або å — та ж літера в шістнадцятковому записі;
- И — приклад коду для кирилиці;
- 水 — шістнадцятковий код китайського ієрогліфа «вода».
Імена
Імена елементів та атрибутів у XML повинні починатися з літери або символу підкреслення (_), далі допускаються літери Unicode, цифри, дефіси, крапки та підкреслення. Завдяки підтримці Unicode імена можуть містити символи практично будь-якої мови – це ключовий фактор інтернаціоналізації.
Пролог
Оголошення XML
XML-декларація (зазвичай запис виду <?xml version="1.0" encoding="UTF-8"?>) вказує версію мови, яка використовується в документі, і може містити інформацію про кодування та атрибут standalone. Хоча ранні версії XML допускали відсутність декларації, сучасна практика та специфікація передбачають її наявність, особливо коли вказано кодування, відмінне від за замовчуванням.
Приклади текстового подання декларації (у документі відображаються як текст):
<?xml version="1.1" encoding="UTF-8"?>
<?xml version="1.0" encoding="windows-1251"?>
Атрибут standalone вказує, чи потрібний доступ до зовнішніх оголошень під час обробки:
- standalone="yes" — документ самодостатній і не вимагає зовнішнього DTD;
- standalone="no" — можливе використання зовнішніх декларацій.
Оголошення типу документа (DOCTYPE)
Інструкція !DOCTYPE дозволяє зв'язати документ із DTD — набором правил, що описують якісь елементи, атрибути та сутності допустимі. Документ без DTD може бути коректним (well-formed), але вважатися невалідним щодо конкретної DTD.
Приклад коректного, але невалідного документа (як простий приклад існування кореневого елемента):
<?xml version="1.0"?>
<greeting>Hello, world!</greeting>
А потім приклад використання зовнішньої DTD:
<?xml version="1.0"?>
<!DOCTYPE greeting SYSTEM "hello.dtd">
<greeting>Hello, world!</greeting>
А також приклад з локальним оголошенням розмітки у DOCTYPE:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE greeting [
<!ELEMENT greeting (#PCDATA)>
]>
<greeting>Hello, world!</greeting>
Специфікація визначає формальну граматику прологу та DOCTYPE (у термінах Бекуса-Наура), що робить визначення суворим та придатним для автоматичної валідації. Експерти та ресурси на кшталт офіційної специфікації W3C та документації на MDN рекомендують використовувати DTD або XML Schema там, де потрібна перевірка структурної коректності та семантики.
Інструкції обробки
Інструкції обробки (processing instructions, PI) служать для передачі спеціальних вказівок додатку, що обробляє документ. Частий приклад — зв'язки з CSS- або XSLT-стилями:
<?xml-stylesheet type="text/css" href="my-style.css"?>
Коментар
Коментарі в XML починаються з послідовності <!-- і закінчуються -->. Всередині коментаря неприпустима комбінація символів --. Коментарі не розглядаються як символьні дані документа та не інтерпретуються як розмітка.
Приклад: <!-- це коментар -->
Кореневий елемент
Елемент та його розмітка
Елемент — це базовий логічний блок XML-документа. Кожен елемент визначається парою початкового та кінцевого тега; імена у парі мають збігатися. Існують також порожні елементи, які задаються одним тегом зі слешем (<empty />).
Форми тегів:
- Початковий тег: <element1>
- Кінковий тег: </element1>
- Тег порожнього елемента: <empty_element1 />
Атрибути можуть бути присутніми лише у початковому тезі або тезі порожнього елемента та задають додаткові властивості у вигляді пар «ім'я-значення».
Приклад практичного використання XML — збереження рецепту у структурованому вигляді (у прикладі нижче теги представлені текстовим чином):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE recipe>
<recipe name="хліб" preptime="5min" cooktime="180min">
<title>Простий хліб</title>
<composition>
<ingredient amount="3" unit="склянка">Борошно</ingredient>
<ingredient amount="0.25" unit="грам">Дріжджі</ingredient>
<ingredient amount="1.5" unit="склянка">Тепла вода</ingredient>
</composition>
<instructions>
<step>Змішати всі інгредієнти та ретельно замісити.</step>
<step>Закрити тканиною і залишити на одну годину в теплому приміщенні.</step>
<!-- <step>Почитати вчорашню газету.</step> -->
<step>Замісити ще раз, покласти на деко і поставити в духовку.</step>
</instructions>
</recipe>
Секція CDATA
Якщо потрібно включити фрагмент тексту, в якому символи розмітки повинні трактуватися як звичайні символи (наприклад, приклади коду), використовується розділ CDATA. Вона починається з <![CDATA[ і закінчується ]]>. Текст усередині CDATA обробляється як символьні дані без інтерпретації <, > та &.
Коректний документ
Коректний (well-formed) документ відповідає загальним правилам синтаксису XML: правильно вкладені теги, що збігаються імена початкового та кінцевого тегів, коректні сутності тощо. Недотримання хоча б одного правила робить документ некоректним і парсер не зможе його розпізнати коректно.
Простори імен
Для усунення конфліктів при об'єднанні XML-фрагментів із різних словників використовується механізм просторів імен (namespaces). Він дозволяє розрізняти однакові імена елементів та атрибутів, що належать різним схемам чи специфікаціям. Більшість посібників з інтеграції XML (включаючи матеріали W3C та практичні посібники, що публікуються експертами з XML) підкреслюють необхідність використання просторів імен у великих проектах та при міжсистемному обміні.
Регламентація роботи з документами: правила, мови, програмні інтерфейси
Ця частина узагальнює рекомендації щодо роботи з XML-документами, багато з яких виходять із публікацій W3C та практичних посібників з обробки XML. Йдеться про вибір кодувань, використання схем валідації, API для парсингу та трансформації (наприклад, SAX, DOM, StAX, XSLT) та правила безпечної обробки зовнішніх сутностей.
Кодування документів
Специфікація XML вимагає підтримки як мінімум двох кодувань: UTF-8 та UTF-16. На практиці більшість сучасних систем і сервісів вважають за краще UTF-8 як стандарт для обміну даними, оскільки вона економічна та сумісна з ASCII. У XML-декларації рекомендується явно вказувати кодування (<?xml encoding="UTF-8"?>), особливо якщо документ може оброблятися різними інструментами або в різних локалях. Ресурси з розробки та стандарти від великих організацій підтверджують: явна вказівка кодування знижує ризик помилок під час парсингу.
| Критерій | Рекомендація | Коментар |
|---|---|---|
| Стандартне кодування | UTF-8 | Широко підтримується, рекомендується для веб-обміну |
| Обов'язковість декларації | Вказувати при нестандартному кодуванні | Якщо декларація відсутня, версія вважається 1.0 |
| Валідація структури | DTD / XML Schema / RELAX NG | Вибирати за вимогами проекту |
XML — корисні поради та цікаві факти
- Використовуйте UTF-8 за промовчанням — це полегшує обмін даними між платформами та запобігає проблемам кодування.
- CDATA корисна для вставлення великих фрагментів коду, але не замінює коректне екранування сутностей в інших місцях.
- Перевіряйте well-formed перед тим, як запускати валідацію проти схеми — багато помилок легше виправити на етапі синтаксичного аналізу.
- Уникайте зовнішніх сутностей, якщо не контролюєте джерело даних — це знижує ризик уразливостей XXE (рада безпеки, яку підтримують експерти з XML).
- Використовуйте простір імен, коли об'єднуєте фрагменти з різних специфікацій — так ви запобігете конфліктам імен та спростите інтеграцію.
Часті питання
Що таке XML і чим він відрізняється від HTML?
XML - це мова markup для опису структури даних і портативності. HTML - спеціалізована мова для відображення та форматування веб-сторінок. XML не визначає візуальне представлення і дозволяє створювати власні теги, тоді як HTML має фіксований набір елементів і семантик
Коли мені слід використовувати CDATA?
CDATA використовується для включення фрагментів тексту, у яких <, і & слід інтерпретувати як звичайні символи, а не як розмітку. Це зручно при вставці прикладів коду або великих блоків тексту, але уникайте використання CDATA замість належного екранування в звичайних ситуація
Як забезпечити правильну обробку мого XML-документа?
По-перше, переконайтеся, що документ добре сформований: правильно прикріплені теги, відповідні назви початкових і кінцевих тегів, правильні сутності. Потім, якщо необхідно, застосуйте валідацію за схемою DTD або XML, щоб перевірити відповідність структурним вимога
Які кодування підтримуються і які вибрати?
Специфікація вимагає підтримки UTF-8 і UTF-16. На практиці UTF-8 рекомендується як первинне кодування для спільного використання та зберігання XML-файлів; його слід явно вказати в декларації XM
