1. Знайомство з XML
Попри те, що сьогодні JSON — стандарт, у Java‑світі повно legacy‑коду, тож іноді ви можете зіткнутися з XML. Корисно мати про нього уявлення. XML (eXtensible Markup Language) — це текстовий формат для зберігання та обміну структурованими даними. Його часто використовують для конфігурацій, обміну між програмами, зберігання даних і навіть для серіалізації об’єктів.
Основні елементи структури XML‑документа:
Теги (елементи):
Усе, що міститься між < і >. Кожен тег відкривається (<tag>) і закривається (</tag>), або є самозакривним (<tag/>).
Атрибути:
Додаткові параметри всередині тега.
Приклад: <user name="Василь" age="25"/>
Текстові вузли:
Текст між тегами.
Приклад: <greeting>Привіт, світе!</greeting>
Приклад простого XML‑документа
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user name="Василь" age="25">Привіт!</user>
<user name="Катя" age="30"/>
</users>
Тут:
- <users> — кореневий елемент.
- <user> — елемент з атрибутами name і age, у першого користувача є текстовий вміст.
2. Ключові поняття
Пролог:
Рядок на початку файлу вказує версію XML і кодування.
Приклад: <?xml version="1.0" encoding="UTF-8"?>
Елементи:
Основні будівельні блоки XML.
Приклад: <book>...</book>
Атрибути:
Параметри всередині відкривального тега.
Приклад: <book title="Java" author="Іванов"/>
Коментарі:
Як у HTML, пишуться між <!-- ... -->.
Приклад: <!-- Це коментар -->
Секції CDATA:
Дозволяють вставляти текст, який не інтерпретується як XML (наприклад, із символами <, & тощо).
Приклад:
<script><![CDATA[
if (a < b && b > 0) { ... }
]]></script>
3. Навіщо потрібні простори імен (namespaces) у XML
Проблема: конфлікт імен
У великих XML‑документах часто трапляються однакові імена тегів, але з різним змістом. Наприклад, у вас є <table> як частина HTML і <table> як частина вашої бізнес‑логіки (наприклад, база даних). Як зрозуміти, який тег що означає?
Без простору імен:
<root>
<table>
<row>...</row>
</table>
<table>
<column>...</column>
</table>
</root>
Тут незрозуміло, який <table> до чого належить.
Рішення: простори імен
Простір імен (namespace) — це спосіб «позначати» елементи й атрибути, щоб уникати конфліктів імен і чітко розділяти значення різних тегів.
- Кожен простір імен — це унікальний URI (зазвичай виглядає як посилання, але це лише ідентифікатор).
- Елементи й атрибути з різними просторами імен вважаються різними, навіть якщо ім’я збігається.
Переваги:
- Немає конфліктів імен між різними стандартами та схемами.
- Можна об’єднувати дані з різних джерел в одному документі.
- Чітко видно, до якого «словника» належить кожен тег.
4. Використання просторів імен: оголошення та застосування
Як оголосити простір імен
У відкривальному тегі елемента вказують спеціальний атрибут xmlns (XML Namespace):
- Без префікса: xmlns="URI" — оголошує простір імен за замовчуванням для всіх вкладених елементів.
- З префіксом: xmlns:prefix="URI" — оголошує простір імен із короткою назвою (префіксом), який використовують для тегів.
Приклад оголошення та використання просторів імен
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Комірка 1</h:td>
<h:td>Комірка 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Стіл</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Тут:
- xmlns:h="..." — оголошує префікс h для HTML‑таблиці.
- xmlns:f="..." — оголошує префікс f для меблів.
- <h:table> і <f:table> — тепер це різні елементи, навіть якщо назва однакова.
Як використовувати простори імен
- Оголошення: У кореневому або будь‑якому іншому елементі: xmlns:prefix="URI"
- Застосування: Перед іменем елемента або атрибута ставлять префікс і двокрапку: <prefix:element>...</prefix:element>
Простір імен за замовчуванням
Якщо оголосити просто xmlns="URI", усі елементи без префікса належатимуть до цього простору імен.
<books xmlns="http://example.com/books">
<book>...</book>
</books>
5. Практика: створення простого XML‑документа з кількома просторами імен
Створімо приклад XML‑документа, де використовуються два простори імен: для HTML і для меблів.
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Комірка 1</h:td>
<h:td>Комірка 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Стіл</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Що тут відбувається:
- У кореневому елементі оголошено два простори імен: h і f.
- Усі елементи з префіксом h: належать до HTML‑таблиці.
- Усі елементи з префіксом f: належать до меблів.
6. Типові помилки
Помилка 1: забули оголосити префікс
<root>
<h:table>...</h:table>
</root>
Результат: аналізатор XML видасть помилку: The prefix 'h' for element 'h:table' is not bound.
Помилка 2: однакові імена без простору імен
<root>
<table>...</table>
<table>...</table>
</root>
Результат: Неможливо розрізнити, який <table> до чого належить.
Помилка 3: неправильне використання префікса
<root xmlns:h="http://www.w3.org/TR/html4/">
<h:table>...</h:table>
<f:table>...</f:table> <!-- Помилка: префікс f не оголошено -->
</root>
Результат: помилка аналізатора: The prefix 'f' for element 'f:table' is not bound.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ