JavaRush /Курси /JAVA 25 SELF /Основи XML і простори імен

Основи XML і простори імен

JAVA 25 SELF
Рівень 47 , Лекція 0
Відкрита

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.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ