%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% :XML Objects
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Objekty v~XML} \label{XML Objects}
Objekt je v~XML vyjádřen jako element s~libovolným intuitivním názvem. Nejčastěji se používá název třídy objektu. Tento element má pak pro každý atribut objektu zavedený dceřiný element, který se jmenuje stejně jako atribut. Vezměme si třídu \texttt{Animal} z~aplikace Animalia. Zajímají nás pouze atributy, pro jednoduchost tedy vynecháme z~popisu všechny metody. Třída \texttt{Animal} vypadá následovně:
\begin{Verbatim}
public class Animal \{
private String genus;
private String species;
private Conservation conservation;
private double minimalHeight;
private double maximalHeight;
private int minimalWeight;
private int maximalWeight;
private String[] range;
\}
\end{Verbatim}
V~jazyce XML by instance této třídy bez specifikovaných hodnot atributů mohla vypadat následovně:
\begin{Verbatim}
\end{Verbatim}
\subsection{Typy a~hodnoty atributů}
V~následující části si ukážeme, jak zapsat hodnoty atributů do jazyka XML.
\subsubsection{Řetězce}
Řetězec zapíšeme do hodnoty XML elementu jako prostý text. Jelikož jazyk XML implicitně předpokládá kódování UTF-8 a~všechny nástroje pracující s~XML s~tím musí počítat, odpadají problémy s~kódováním textu. Jedinou překážkou zůstávají znaky \texttt{$<$}, \texttt{$>$} a~\texttt{\&}, které mají v~XML svůj vlastní význam a~je třeba je zakódovat pomocí jejich escape sekvencí. V~příkladu vyplníme hodnoty atributů rod (genus) a~druh (species) zvířete na medvěda hnědého.
\begin{Verbatim}
\codeHighlight{ursus}
\codeHighlight{arctos}
\end{Verbatim}
\subsubsection{Čísla}
Čísla zapisujeme do hodnoty XML elementu jako prostý text. U~desetinných čísel můžeme používat klasický zápis s~desetinnou čárkou nebo používat exponent. Oba záspisy jsou ekvivalentní zápisu čísla v~jazyce Java. Pokud nemáme k~dispozici XML Schema s~popisem struktury dokumentu, nepoznáme v~XML rozdíl mezi číslem a~textem obsahujícím pouze číslovky. V~praxi je ale tento problém nepodstatný, jelikož text obsahující samé číslovky lze beze ztráty převést na číslo a~naopak. Rozšiřme teď objekt medvěda hnědého o~údaje o~rozsahu jeho hmotnosti (weight) v~kilogramech a~také jeho možné výšce v~kohoutku (heigth) v~metrech.
\begin{Verbatim}
ursus
arctos
\codeHighlight{100}
\codeHighlight{800}
\codeHighlight{0.87}
\codeHighlight{1.26}
\end{Verbatim}
\subsubsection{Výčtové typy}
Pokud je atribut výčtovým typem, pak jeho hodnotu zapisujeme jako obyčejný řetězec. V~příkladu si ukážeme, jak přidat do XML objektu reprezentujícího medvěda hnědého atribut o~stupni ohrožení (conservation state). U~medvěda hnědého jde o~stupeň \emph{málo dotčený} (Least Concern) uváděný zkratkou LC.
\begin{Verbatim}
ursus
arctos
100
800
0.87
1.26
\codeHighlight{LC}
\end{Verbatim}
Pro zajímavost uveďme ještě některé další stupně ohrožení. Jsou to VU (Vulnerable -- zranitelný), EN (Endangered -- ohrožený) a~CR (Criticaly Endangered -- kriticky ohrožený). Jejich zápis by byl obdobný.
\subsubsection{Pole}
Pokud je některý atribut objektu typu pole, pak ho převedeme do XML následovně. Pro každý prvek pole vytvoříme XML element s~názvem pole. Tyto prvky pak dohromady tvoří celé serealizované pole. Pro prvky můžeme použít obalovací element, obecně se to ale moc nedoporučuje. Příkladu ukazuje, jak serializovat pole rozšíření (range) medvěda hnědého do XML.
\begin{Verbatim}
ursus
arctos
LC
100
800
0.87
1.26
\codeHighlight{North America}
\codeHighlight{Himalaya}
\codeHighlight{Syria}
\codeHighlight{Alaska}
\codeHighlight{Eurasia}
\codeHighlight{Kamchatka}
\end{Verbatim}
\subsubsection{Vnořené objekty}
Je celkem běžné, že typ atribut nějakého objektu je zase objekt. V~takovém případě aplikujeme rekurzivně celý postup. Jedinou změnou je zde to, že XML element reprezentující atribut typu objekt už nemůže mít libovolné jméno. Jeho jméno musí být shodné se jménem atributu. Jméno třídy je zde komletně ignorováno.
\subsection{JavaBeans a~serializace do XML}
Nejlépe se jako objekty do XML převádí JavaBeany. Zvažte, že objekt serializovaný do XML je vlastně struktura (jako v~jazyce C++). Deklarace i~definice metod se při serializaci ztratí. Zároveň však potřebujeme mít pro každý atribut přístupovou (\emph{get}) a~nastavovací (\emph{set}) metodu. Jedině tak dokáže XML serializátor získat hodnoty všech atributů, které potřebuje pro kompletní serializaci. Při deserializaci zase parser potřebuje za běhu zkonstruovat novou instanci a~nastavit hodnoty jejích atributů, na což potřebuje bezparametrický konstruktor a~nastavovací metodu pro každý atribut. Jelikož názvy atributů objektu v~XML formě jsou stejné, jako v~Javovském kódu, potřebujeme mít nastavovací a~přístupové metody vhodně pojmenovány. To vše splňují JavaBeany, proto byste při převodu do XML měli používat výhradně právě je.