— Як справи?

— Чудово. Не скаржуся. Сьогодні Білаабо розповів про JavaScript. Не все, звісно, але теж чимало. Я, звичайно, ще на JS нічого не писав, але думаю, що це нескладно.

А Еллі розповіла про серіалізацію в JSON. І ти розповідав про Jackson framework і як налаштовувати поліморфну десеріалізацію за допомогою анотацій.

— Ніфіга собі, ти розумний тепер, Аміго! Серйозний мужик!

— А то!

— Гаразд. Давай на роботу. Сьогодні нова та цікава тема – XML.

XML, Серіалізація в XML - 1

XML – це стандарт представлення даних, які легко можуть бути прочитані людиною, а ще легше – програмою. Приклад xml-файлу:

XML
<data>
<owner first="Nikolay" last="Ivanovich">
<address>Moscow</address>
</owner>
<cat name="Murka" age="15"/>
</data>

Основ XML – це теги. Тег – це слово у трикутних дужках (знаки менше та більше). Теги бувають відкривають і закривають. Одному відкриває всього відповідає один закриває тег. Теги, що відкривають, можуть мати атрибути.

У тег можна складати інші теги, отримуючи таким чином дерево елементів. Тег верхнього рівня називають коренем (root): у нього є дочірні теги, мають свої дочірні теги.

Приклади:

Тег Опис
<data> Відкриваючий тег "data"
</data> Тет, що закриває «data»
<cat name="Murka" ; age="15"> Тег з атрибутами. Значення атрибутів беруться у лапки
<data>
<owner>
<cat name="Murka"/>
</owner>
</data>
Вкладені теги.
<cat name="Murka" age="15" /> Автозакривається тег.
Такому тегу не потрібний закриваючий.
Не може містити дочірні теги.
<info>
Здесь може бути будь-яка інформація
</info>
Тег може містити текстові дані
<info>
Здесь може
<data xxx="yyy">
</data>
бути будь-яка
<data 2xxx="yyy"/>
інформація
</info>
Тег може містити текстові дані та інші теги впереміш.

— Виглядає нескладно. А які мітки бувають?

— Будь-які. Жодних зарезервованих тегів немає. XML – це мова для опису будь-яких даних. Люди самі вигадують теги для своїх потреб та домовляються, як їх використати.

Фактично, XML – це спосіб записати дані у вигляді дерева елементів, зрозумілий комп'ютеру.

— Начебто зрозуміло. До речі, маю питання.

Ось JSON використовується для передачі даних з браузера на сервер, а де використовується XML?

— Так там, де і JSON: для зберігання та передачі даних.

Добре, продовжимо.

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

Щоб гарантувати унікальність тегів, вони вигадали префікси. Виглядає так:

Теги Опис
<animal:cat> Тег cat з префіксом animal
<animal:cat>
</animal:cat>
<zoo:cat>
</zoo:cat>
Два теги cat з різними префіксами.
<animal:cat zoo:name="MX"> Тегcat з префіксом animal, атрибут name< /span> з префіксом zoo.

Префікси ще називають namespace – простір імен. Тоді остання пропозиція в таблиці звучатиме так «Тег cat із простору імен animal з атрибутом name із простору імен zoo».

До речі, пам'ятаєш у Java клас має коротке ім'я, а є довге унікальне ім'я, в яке входить назва пакета, його ще вказують при імпорті?

— Ага.

— Так ось, у префіксів теж є унікальне довге ім'я і його теж вказують при імпорті:

Приклад
<data  xmlns:soap="http://cxf.apache.org/bindings /soap">
<soap:item>
<soap:info/>
</soap:item>
</data>

«xmlns:soap» означає «XML namespace SOAP»

Більш того, якщо є теги без префікса, можна задати і їх унікальне ім'я:

Приклад
<data xmlns="http://www.springframework. org/schema/beans"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xmlns:task="http://www.springframework.org/schema/task">
<soap:item>
<soap:info/>
<task:info/>
</soap:item>
</data>

«xmlns=…» задає namespace для порожнього префікса - тобто. для тегів без префіксу, таких як data.

У документі може бути скільки завгодно namespace, але у кожного має бути своє унікальне ім'я.

— Зрозуміло. А чому такі дивні «унікальні імена» у цих namespace?

— Зазвичай там вказують URL, за яким знаходиться документ, який описує цей namespace та/або його XML-теги.

— Не так і мало на мене сьогодні вилили інформації. Що ще?

— Ще трохи лишилося.

По-перше, XML має заголовок – спеціальний рядок, який описує версію цього XML і кодування файлу.

Виглядає вона так:

Приклад
<?xml version< /span>="1.0" encoding="UTF-8"?>
<data xmlns:soap="http://cxf.apache.org/bindings/soap">
<soap:item>
<soap:info/>
</soap:item>
</data>

Якщо в XML можна вставляти коментарі. Для початку коментаря використовують «<!—», а для кінця «—>».

Приклад
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:soap="http://cxf.apache.org/bindings/soap">
<soap:item>
<!-- <soap:info/> -->
</soap:item>
<!-- це теж коментар -->
</data>

— Поки що зрозуміло.

— Через те, що в XML використовуються символи «< > “ &”, їх не можна використовувати в інших місцях. Для їхнього опису використовують так звані «ескейп послідовності» — набір символів для представлення інших символів/символу. Ось список деяких із них:

Escape-послідовність Символ, який вона замінює
&amp; &
&quot; "
&lt; <
&gt; >
&apos; '

А ось приклад коду, який зберігається в XML:

Java-код Він же, у XML
if (a<b)
System.out.println("a is minimum");
<code>
if (a&lt; b)
System.out.println(&quot;a is minimum&quot;);
</code>

— М-так. Виглядає не дуже гарно.

— А ти пам'ятаєш, у Java теж екрануються деякі символи. наприклад "\". І теж для його написання у рядку доводиться писати його двічі. Так що це найпоширеніше явище.

— Ок.

— У мене сьогодні все.

— Ура. Нарешті я відпочину.