Lekce 6 - Úvod do formátu XML souborů v Javě
V předešlém cvičení, Řešené úlohy k 1.-5. lekci práce se soubory v Javě, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním Java tutoriálu se zaměříme na formát XML.
Nejprve si tento formát popíšeme a poté si ukážeme třídy, které nám Java poskytuje k jeho čtení a zápisu.
Formát XML
Nyní vás zahrnu spoustou pojmů, když něčemu nebudete rozumět, vůbec to navadí, vše si tu ještě probereme
XML (eXtensible Markup Language) je značkovací jazyk, který vyvinulo W3C (organizace, která má na starosti webové standardy). XML je velmi univerzální a je podporováno řadou jazyků i aplikací.
Slovo extensible (rozšiřitelný) označuje možnost vytvořit si pomocí XML vlastní jazyk, tím je např. XHTML pro tvorbu webových stránek. XML je jazyk samopopisovací. Ze struktury poznáme, co která hodnota označuje.
Zatímco u CSV formátu se můžeme jen domnívat, co je ta třetí osmička, v XML by nám bylo hned jasné, že je to počet článků uživatele (například). Nevýhodou formátu je samozřejmě jeho větší velikost, což nám však ve většině případů nevadí.
Osobně téměř vždy při výběru formátu sahám po XML, hodí se např. k uložení konfigurace programu, hiscore hráčů hry nebo k menší databázi uživatelů. Díky XSD schématům ho můžeme jednoduše zvalidovat a předejít chybám při běhu programu.
XML je možné zpracovávat hned několika způsoby. Obvykle jednoduchým kontinuálním čtením/zápisem nebo pomocí objektové struktury DOM. Došlo to tak daleko, že nám některé nástroje umožňují s XML dokumentem pracovat jako s databází a volat nad ním dotazy (používá se k tomu jazyk XPath nebo SQL). Asi si dokážete představit, že to usnadní práci.
XML se velmi často používá k výměně dat mezi rozdílnými systémy (např. desktopovou aplikací a webovou aplikací na serveru).
Pro XML existuje mnoho knihoven a každý nástroj ho zná a umí s ním pracovat. S tím souvisejí webové služby, SOAP a podobně.
Když jsme ukládali uživatele do souboru CSV. Ukládalo se jméno, věk a datum registrace. Hodnoty byly za sebou, oddělené středníky. Každý řádek představoval jednoho uživatele. Obsah souboru vypadal tedy asi takto:
Pavel Slavík;22;21.3.2000 Jan Novák;31;30.10.2012
Nezasvěcený z toho nic moc nepozná, že? Udělejme si nyní ekvivalent souboru ve formátu XML:
<?xml version="1.0" encoding="UTF-8" ?> <uzivatele> <uzivatel vek="22"> <jmeno>Pavel Slavík</jmeno> <registrovan>21.3.2000</registrovan> </uzivatel> <uzivatel vek="22"> <jmeno>Jan Novák</jmeno> <registrovan>30.10.2012</registrovan> </uzivatel> </uzivatele>
Nyní každý vidí, co je v souboru uloženo. Věk jsem zde uložil jako
atribut jen proto, abych ukázal, že je XML umí, jinak by mohl být jako
element spolu se jménem a registrován. Nyní jsem tedy vyzradil, že
jednotlivým prvkům se říká elementy. Ty určitě všichni
znáte z HTML, které vychází ze stejných základů jako XML. Elementy jsou
většinou párové, tedy otevírací, poté následuje hodnota
a uzavírací s lomítkem. Elementy mohou obsahovat další elementy, struktura
je tedy stromová. Díky tomu není problém do jediného XML
dokumentu uložit celou hierarchii objektů.
Na začátku souboru je XML hlavička. Aby byl dokument
validní, musí obsahovat právě 1 kořenový element, zde
element uzivatele
, ve kterém jsou zabaleny další elementy.
Atributy se píší za název atributu do uvozovek.
Určitě vidíme, že soubor nám nabobtnal. To je daň za to, že vypadá hezky. Kdyby neměl uživatel atributy jen 3, ale např. 30, bylo by vidět, jak CSV formát přestává stačit.
Osobně se s přibývajícími zkušenostmi stále více přikláním k řešením, která jsou přehledná a jednoduchá, i když třeba zabírají více paměti (a to nejen v souborech, ale i ve zdrojovém kódu). Nic není horšího, než když programátor přijde za rok ke svému programu a vůbec neví, co je ten osmý parametr v CSV, kde je na řádku 100 nějakých čísel. Nebo co je to pětirozměrné pole, které je sice hrozně rychlé, ale kdyby si místo něj postavil objektovou strukturu, nemusel by nyní psát program znovu. Ale to jsem odbočil.
XML v Javě
Existují dva základní přístupy ke XML. Kontinuální přístup (tzv. SAX parser) a objektový přístupu (DOM). Opět máme v Javě více způsobů, jak s XML pracovat, existuje zde mnoho tříd. Pokusil jsem se zde ukázat to nejjednodušší a zároveň správné řešení.
Parsování XML přes SAX
SAX (jako Simple API for XML) je vlastně jednoduchá
nadstavba čtečky textových souborů. Zápis je poměrně
jednoduchý, postupně zapisujeme elementy a atributy tak, jak jdou v souboru za
sebou. Stromovou strukturu zde tedy ignorujeme. Java nám poskytuje třídu
XMLStreamWriter
, která je dále obalena třídou
SAXParserFactory
. Ta nás odstiňuje od toho, že je XML textový
soubor. Pracujeme pouze s elementy.
Čtení probíhá podobně, jako zápis. XML tedy čteme jako
textový soubor, řádek po řádku, odshora dolů. SAX nám
však nedává řádky, ale postupně tzv. uzly (anglicky
node), na které při čtení postupně naráží. Uzel může být
element, atribut nebo
hodnota. V cyklu uzly dostáváme tak, jak jdou v souboru za
sebou. Ke čtení použijeme třídu XMLStreamReader
.
Výhodou SAX je vysoká rychlost a paměťová nenáročnost. Nevýhody poznáme, až tento přístup srovnáme s objektovým přístupem DOM.
V následujícím kvízu, Kvíz - Práce s CSV soubory a úvod do XML v Javě, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.