— Как делишки?

— Отлично. Не жалуюсь. Сегодня Билаабо рассказал про 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 с префиксом 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» значит «XMLnamespace 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="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 тоже экранируются некоторые символы — например «\». И тоже для его написания в строке приходится писать его дважды. Так что это часто встречаемое явление.

— Ок.

— У меня на сегодня все.

— Ура. Наконец-то я отдохну.