6. diel - Úvod do formátu súborov XML v Jave
V predchádzajúcom cvičení, Riešené úlohy k 1.-5. lekcii práce so súbormi v Jave, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnom tutoriáli Java sa zameriame na formát XML.
Najprv si tento formát popíšeme a potom si ukážeme triedy, ktoré nám Java poskytuje na jeho čítanie a zápis.
Formát XML
Teraz vás zahrniem množstvom pojmov, ale keď niečomu nebudete rozumieť,
vôbec to navadí, všetko si tu ešte preberieme 
XML (eXtensible Markup Language) je značkovací jazyk, ktorý vyvinulo W3C (organizácia, ktorá má na starosti webové štandardy). XML je veľmi univerzálny a je podporovaný množstvom jazykov i aplikácií.
Slovo extensible (rozšíriteľný) označuje možnosť vytvoriť si pomocou XML vlastný jazyk, tým je napr. XHTML na tvorbu webových stránok. XML je jazyk samopopisovací. Zo štruktúry zistíme, čo ktorá hodnota označuje.
Zatiaľ čo pri CSV formáte sa môžeme len domnievať, čo je tá tretia osmička, v XML by nám bolo hneď jasné, že je to počet článkov používateľa (napríklad). Nevýhodou formátu je samozrejme jeho väčšia veľkosť, čo nám však vo väčšine prípadov nevadí.
Ja osobne takmer vždy pri výbere formátu siaham po XML, pretože sa hodí napr. na uloženie konfigurácie programu, hiscore hráčov hry alebo k menšej databáze užívateľov. Vďaka XSD schémam ho môžeme jednoducho zvalidovať a predísť chybám pri spustení programu.
XML je možné spracovať hneď niekoľkými spôsobmi. Zvyčajne jednoduchým kontinuálnym čítaním/zápisom alebo pomocou objektovej štruktúry DOM. Došlo to tak ďaleko, že nám niektoré nástroje umožňujú s dokumentom XML pracovať ako s databázou a volať nad ním dotazy (používa sa na to jazyk XPath alebo SQL). Asi si dokážete predstaviť, že to uľahčí prácu.
XML sa veľmi často používa na výmenu dát medzi rozdielnymi systémami (napr. desktopovou aplikáciou a webovou aplikáciou na serveri).
Pre XML existuje mnoho knižníc; pozná ho a vie s ním pracovať každý nástroj. S tým súvisia webové služby, SOAP a podobne.
Keď sme ukladali používateľa do súboru CSV, ukladalo sa meno, vek a dátum registrácie. Hodnoty boli za sebou, oddelené bodkočiarkami. Každý riadok predstavoval jedného používateľa. Obsah súboru vyzeral teda asi takto:
John Smith;22;3/21/2000 James Brown;31;10/30/2012
Ten, kto sa tomu nevenuje, tu toho veľa nespozná, však? Urobme si teraz ekvivalent súboru vo formáte XML:
<?xml version="1.0" encoding="UTF-8" ?> <users> <user age="22"> <name>John Smith</name> <registered>3/21/2000</registered> </user> <user age="31"> <name>James Brown</name> <registered>10/30/2012</registered> </user> </users>
Teraz každý vidí, čo je v súbore uložené. Vek som tu uložil ako atribút len preto, aby som ukázal, že to XML vie, inak by mohol byť ako element spolu s menom a dátumom registrácie. Teraz som teda prezradil, že sa jednotlivým prvkom hovorí elementy. Tie určite všetci poznáte z HTML, ktoré vychádza z rovnakých základov ako XML. Elementy sú väčšinou párové, teda otváracie, potom nasleduje hodnota a uzatváracie s lomkou. Elementy môžu obsahovať ďalšie elementy, štruktúra je teda stromová. Vďaka tomu nie je problém do jedného XML dokumentu uložiť celú hierarchiu objektov.
Na začiatku súboru je XML hlavička. Aby bol dokument
validný, musí obsahovať práve 1 koreňový element, tu
element users, v ktorom sú zabalené ďalšie elementy. Atribúty
sa píšu za názov atribútu do úvodzoviek.
Určite vidíme, že sa nám súbor zväčšil. To je daň za to, že vyzerá pekne. Keby nemal používateľ atribúty len 3, ale napr. 30, bolo by vidieť, ako už formát CSV prestáva stačiť.
Osobne sa s pribúdajúcimi skúsenosťami stále viac prikláňam k riešeniam, ktoré sú prehľadné a jednoduché, aj keď zaberajú viac pamäte (a to nielen v súboroch, ale aj v zdrojovom kóde). Nič nie je horšie, ako keď sa programátor vráti za rok k svojmu programu a vôbec nevie, čo je ten ôsmy parameter v CSV, kde je na riadku nejakých 100 čísel. Alebo čo je to päťrozmerné pole, ktoré je síce hrozne rýchle, ale keby si namiesto neho postavil objektovú štruktúru, nemusel by teraz písať program znova. Ale to som už trochu odbočil.
XML v Jave
Existujú dva základné prístupy ku XML. Kontinuálny prístup (tzv. SAX parser) a objektový prístup (DOM). Opäť máme v Jave viac spôsobov, ako s XML pracovať, pretože tu existuje mnoho tried. Tu som sa pokúsil ukázať to najjednoduchšie a zároveň správne riešenie.
Parsovanie XML cez SAX
SAX (ako Simple API for XML) je vlastne jednoduchá
nadstavba čítačky textových súborov. Zápis je pomerne
jednoduchý, postupne zapisujeme elementy a atribúty tak, ako idú v súbore za
sebou. Stromovú štruktúru tu teda ignorujeme. Java nám poskytuje triedu
XMLStreamWriter, ktorá je ďalej obalená triedou
SAXParserFactory. Tá nás odvádza od toho, že XML je textový
súbor. Pracujeme iba s elementmi.
Čítanie prebieha podobne, ako zápis. XML teda čítame ako
textový súbor, riadok po riadku, zhora nadol. SAX nám však
nedáva riadky, ale postupne tzv. uzly (anglicky node), na
ktoré pri čítaní postupne naráža. Uzol môže byť
element, atribút alebo
hodnota. V cykle uzly dostávame tak, ako idú v súbore za
sebou. Na čítanie použijeme triedu XMLStreamReader.
Výhodou SAX je vysoká rýchlosť a pamäťová nenáročnosť. Nevýhody spoznáme, keď tento prístup porovnáme s objektovým prístupom DOM.
V nasledujúcom kvíze, Kvíz - Práca s CSV súbormi a úvod do XML v Jave, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.

David sa informačné technológie naučil na