6 XML
6.1 Uchování dat
Základním nástrojem na práci s XML soubory je třída TXMLdata. Objekty této třídy dokáží (s pomocí parseru Expat v 1.95.8) tyto soubory načíst (metoda readFile) a následně je drží v paměti ve stromové struktuře (DOM), se kterou se následně pracuje.
XML soubory využívané k provozu programu splňují normu verze 1.0 a jsou kódovány v UTF - kvůli snadné přenositelnosti na různé operační systémy. Jejich struktura však není libovolná, ale zcela záměrně, pro zvýšení efektivity práce, mají soubory tyto hlavní vlastnosti:
Při budování stromové struktury se postupuje následovně. Jeden tag je udržován ve struktuře xmlcontainer, která obsahuje jeho název, pomocné informace o indexech a dynamické pole, do kterého se umisťují data podle indexů daného tagu nebo odkaz na hašovací tabulku v případě, že tento tag nebyl list. Velikost této tabulky je dána konstantou HASH_TABLE_SIZE. Toto pole zaručuje dostatečně rychlou odezvu i v případě velké mapy, kterou tvoří mnoho (i tisíce) tagů <hex> s různými indexy a zároveň jeho velikost přizpůsobená počtu tagů s různými indexy nezabírá příliš zbytečného místa v paměti. Do této tabulky se vkládá opět struktura xmlcontainer podle jména synovského tagu (používá se metoda hašování s řetězci). Jméno kořenového tagu se neukládá a nepoužívá se ani xmlcontainer, nýbrž privátní atribut (pole) data. Kolize při hašování jsou řešeny metodou se separovanými řetězci.
<?xml version="1.0" encoding="UTF-8"?>
<K8>
  <A>
    <C>Text 1</C>
  </A>
  <B id=“1”>
    <D>Text 2</D>
    <E>Text 3</E>
  </B>
  <B id=“2”>
    <F>Text 4</F>
  </B>
</K8>

Diagram 6.1: Schématické zobrazení reprezentace daného XML souboru v paměti.
6.2 Práce s daty
Tagy, se kterými uživatel chce pracovat, se určují podle cesty od kořene - což nazveme dotazem. Většina metod na získání nebo uložení dat (např. setData, setDataInt, getData, getDataInt ) vyžaduje cestu přesnou, avšak existují i metody na vyhledávání dat podle zadaných kritérií - většinou se jedná o hledání ID tagů, jako je to i u metody getIdOfTagWhoseChildContains. K vyhledávání, mazání a podobným operacím se využívá metoda lookThrough, která na svém vstupu očekává odkazy na 4 funkce, pojmenované before, middle, after a out, které provádí operace na stromové struktuře před vstupem do nižší stromové úrovně, resp. operace na vlastním tagu, resp. operace po navrácení z nižší úrovně, resp. operace přímo na stromové struktuře (např. mazání potomků, při uvolňování objektu).
Pro ještě větší zvýšení efektivity se používá pole mem, do kterého se ukládá poslední dotaz, protože se ukázalo, že se v naprosté většině situací pracuje s daty, které jsou ve stromě uloženy "blízko".
MetodaPopis
setData Nastaví obsah tagu proměnnou typu na daný řetězec
setDataInt Nastaví obsah tagu proměnnou typu na dané celé číslo
setDataDouble Nastaví obsah tagu proměnnou typu na dané reálné číslo
getData Získá obsah tagu jako řetězec
getDataResize Získá obsah tagu jako řetězec s tím, že vstupně-výstupní parametr data2 případně zvětší, aby pojal celý obsah tagu
getDataInt Získá obsah tagu jako celé číslo
getDataDouble Získá obsah tagu jako reálné číslo
getDataRaw Získá odkaz na obsah tagu - pro zvýšení rychlosti. Tuto metodu je však možné používat pouze na čtení dat.
readFile Načte požadovaný XML soubor
readChar Načte XML uložené v řetězci
readChar Načte XML uložené v řetězci
saveToFile Uloží do souboru
getListOfIds Vrátí seznam indexů v subtagu od místa dané cestou
getNumId Vrací počet různých indexů použitých v subtagu od místa dané cestou
Tabulka 6.2: Seznam nejdůležitějších metod třídy TXMLdata.
6.3 Práce s XML posílanými přes síť
Nástavbou na TXMLdata, je třída TPackage, která slouží pro přípravu XML zprávy posílané přes síť. Kromě toho, že umí vkládat a získávat uložená data - podobně jako třída TXMLdata, má speciální metody na získání odesílatele a adresáta zprávy (metody msgFrom a msgTo) a také metodu send, která odešle zprávu (pokyn k odeslání) s odkazem na sama sebe (viz odesílání dat přes síť).
Potomek této třídy TPackSmall, slouží ke zjednodušení práce s TPackage a slouží pouze k vytvoření imaginárního kořene uprostřed velkého XML stromu a tudíž ke zjednodušení kladených dotazů.