Září 2009

XML jako databáze ve Windows prakticky (1)

16. září 2009 v 11:39 | Ing Oldřich Oplatek |  XML

Při návrhu programů psaných v Delphi 7 pro Windows opakovaně vyvstává problém, jak ukládat data, aby uživatel nemusel instalovat jakékoliv podpůrné databázové stroje, inicializovat jakési soubory INI a nastavovat jejich parametry - což on z pochopitelných důvodů nechce dělat a také neudělá. Většinou se nejedná o žádná rozsáhlá data, dají se uchovávat během chodu programu v paměti, ale jejich organizace v paměti je vždycky individuální, bez možnosti obecnějšího využití a bez ohledu na uživatele jde v neposlední řadě i o pohodlí programátora...

Mám velmi dobré zkušenosti s provozováním relačního databázového systému MySQL pod Windows, ale jeho použití je pro uživatelské programy prakticky vyloučené - právě pro nutnost dost komplikované instalace systému MySQL.
Prozatím se mi osvědčilo uchovávání dat v paměti v textovém formátu, přičemž jsou oddělovány jednotlivé položky v záznamech obráceným apostrofem '`'. Přístup k datům je až překvapivě rychlý, ale tento postup vyžaduje precizní návrh struktury dat předem a každá případná změna ve struktuře dat je obtížně řešitelná, protože program je fixován na pevné uspořádání položek v záznamech. Tento princip jsem využil v programu FILATELOP pro evidenci sbírky známek, kde textová data bez obrázků zabírají asi 26 MByte. Obrázky jsou ukládány v samostatně organizovaném souboru a jejich rozsah je řádově vyšší - 250 MByte. Nejdelší dobu trvá načtení dat do paměti a jejich kontrola potřebné transformace, další zpracování pak probíhá velice rychle.

Pro organizaci a zpracování dat v programu jsem tedy stanovil následující podmínky:

- nepoužití žádné další nadstavby, která vyžaduje po uživateli práci s instalací navíc;
- možnost snadných změn dat i mimo obslužný program a mořnost alespoň minimálních změn či doplňků struktury dat.

Co ale s tím? - Je plno chytrých lidí, kteří řeší problémy kolosálně většího rozsahu, ale můj malý český problém tvrdošíjně odolává jakýmkoliv pokusům o řešení - a že jsem jich už udělal dost...

Tak jsem vlastně naslepo hledal po Googlu, jak na to.
Je to vždycky problém, že začnete něco studovat a nakonec zjistíte společně s Járou Cimrmanem, že "foukáním cigaretového kouře do umyvadla s vodou zlato nevzniká..."

Ale po Internetu se stále opakují myšlenky, že XML je jazykem tisíciletí, který umožňuje zpracovávat data i dokumenty, a že to je prý to pravé - ořechové!
Koupil jsem si recenzenty vychvalovanou knihu o XML, že prý z ní teprve pochopili, co to je, jak se to používá a jak je to úžasné.
Byla to rána pod pás! Asi na třetí stránce byl přehled volání funkcí v jakémsi systému uvedený takto (necituji, jen podle paměti):
Přehled používaných funkcí:
GetCollection()
HasSiblings()
GetChildList()

Vše je zřejmé, protože názvy funkcí jsou samovysvětlující.

Asi samovysvětlující všem, ale jenom mně jedinému na světě ne! To byla opravdová porážka kontumačně! Co je to samovysvětlující a komu? A proč to nic nesamovysvětluje mně?
Zlaté staré dobré databáze! Tam mi řekli, že textová položka může mít maximálně 255 znaků a já jsem to vzal jako fakt a rozuměl jsem tomu tak, že jméno indického básníka Rabíndranáth Thákur se tam určitě vejde! Nebylo to samovysvětlující, ale zato pochopitelné...

Můj výsledek - já při svých omezených duševních schopnostech nepochopil vůbec nic. Jedině to, že v této oblasti existuje přehršel mě nepochopitelných a nesrozumitelných zkratek typu XML Schema, DOM, DTD, CDATA, XPath, XPointer, XLink, XQuery - a byl jsem hotov! - Prostě nic pro blbce! Co s tím v tak poraženecké náladě?
Nikde přehledná tabulka, kde to vzít, to mám někde koupit nebo co, nebo to vyžaduje další instalace? No prostě v hlavě zmatek. Jen každý autor vysvětlí na začátku, co je vlastně za zkratku to XML, ale to mi vůbec k ničemu nebylo, proto tady vysvětlení neuvádím, najdete ho všude.
Z toho všeho jsem usoudil, že knihy píší opravdoví odborníci, kteří buď předpokládají u užívatele znalosti - pak jsem si nemusel kupovat knihu, když mám doma tucty jiných a zábavnějších - nebo byla kniha nesprávná a pro jinou kategorii čtenářů.

Tak jsem se vlastně rozhodl popsat své pocity ještě snad ve stavu, kdy toho o XML moc nevím, ale aspoň se podělím s jinými snad na stejné úrovni o zážitky při klopotném pátrání po využitelnosti čehosi, čemu nerozumím a o čem tuším, že to snad k něčemu je.

Postupně jsem zjistil, že nejvyšším božstvem přes XML je jakési konsorcium W3C, kam směřují tisíce odkazů. Tak jsem náhodně jeden odkaz následoval. Radím vám dobře, nedělejte to! Je to pro machry, kteří tomu rozumějí, a ne pro ty, kteří o tom vůbec nic neví. Nešťastnou náhodou jsem se proklubával jakýmsi anglickým itinerářem bodů o XML a až po delší době jsem pochopil, že si konsorcium před lety stanovilo body postupu, a v tomto itineráři si pochvalně potvrzuje, které body už splnilo (prakticky všechny). Mám k těmto lidem samozřejmě úctu i obdiv, ale bohužel mi to nijak nepomohlo.

Zůstala otázka mého dřívějšího šéfa, který se při nejasnostech vždycky ptal "K čemu se to jí?"
Moje odpověď: "Vím já?"

Ale stále jsem se nevzdával. Nejsem matematik a pochopil jsem jedno, že čtu informace většinou na akademické úrovni, a to od velice vzdělaných lidí, kterým je naopak jasné, "K čemu se to jí".

Prokousával jsem se dál jako samouk bez nějakého školení, semináře či kurzu. Asi by to bylo účelné, ale já každou takovou akci většinou prospím, protože vzdělaný přednášející mi ujede do nadoblačných výšin, ke kterým jsem já prozatím nedosáhl ani prstíčkem, takže mě jeho snaha nakonec ruší v mém příjemném klimbání.

Mám průměrné znalosti o jazyku HTML pro psaní programů pro internetové prohlížeče. Bez dalšího pochopení jsem se dozvěděl, že XML je něco podobného, ale na vyšší úrovni. také to používá nepřeložitelné či nepřekládané slovo 'tag'.Na rozdíl od HTML jsem však nikde neviděl výsledky takto dokonalého XML, zatímco při zápisu několika řádků v HTML vidíte v prohlížeči okamžitě výsledky svého snažení, ať dobré či blbé, ale pořád výsledky.

Ale musím po dosavadních zkoušenostech uznat, že výsledky z XML na Internetu skutečně existují a jsou opravdu reálné, ale vše je jaksi zastřeno obrovským zázemím, které je skryto už prvotně v samotných prohlížečích, jako je Internet Explorer či Mozilla, o jejichž vnitřních schopnostech nemá našinec ani ponětí.

Základy jazyka XMLvás poučí o tom, že tag je jakýsi text mezi znaky či značkami "menší" a větší", tedy mezi znaky < a > a to chápáno včetně obou uvedených značek.


ZADÁNÍ UKÁZKOVÉ DATABÁZE

Chceme-li si vytvořit databázi o našich knihách doma, v databázových systémech bychom definovali třeba soubor nebo tabulku 'knihovna' a záznam kniha o každé knize by obsahoval položky:
- nazev
- autor
- cislo (jakékoliv evidenční číslo, třeba pořadové)
-umisteni (např. pokoj, kuchyň, dětský pokoj)

Diakritiku u názvů položek záměrně nepoužívám - je to dáno jak vlastnostmi použitého systému, tak navazujících dalších systémů. Dle mého názoru je daleko univerzálnější pro názvy souborů, tabulek a položek:

- nepoužívat znaky národní abecedy

- nepoužívat exotické znaky, které se dají vysvětlit jinak - např. matematické operátory minus, plus, ani tečku, dvojtečku, otazník, normální lomítko, obrácené lomítko apod., vyhýbat se použití samostatné skupiny znaků notoricky známých systémů, např http, xml, html, MySQL, a raději takové skupiny neuvádět ani na první pozici označení položek

- používat buď jenom velká nebo malá písmena, ať daný systém dovoluje cokoliv;
- nezačínat žádný název číslicí;
- pro lepší čitelnost se doporučuje používat znaku podtržítko (já ovšem myslím, že to čitelnost nikterak nezvyšuje)
- u rozsáhlejších systémů doporučuji název položky kombinovat se znaky z názvu souboru nebo tabulky - v našem případě např.: kninazev, kniautor, knicislo, kniumisteni - není to samozřejmě nutné, ale pak ve větší databázi se tak přehledně rozliší příslušnost položky k nadřazené úrovni.

Takže jsme trochu blíže k definici ukázkové databáze v XML.

Ale teď konečně tagy!
Tag v XML definuje cosi neurčitého, o čem není nic známo, ALE v případě naší ukázky budou tagy definovat ekvivalent souboru či tabulky v databázovém systému.
Každý údaj v XML musí být bez vyjímky uveden mezi úvodním a ukončujícím tagem, čili v tzv páru tagů. Na všechno existují vyjímky, takže i povinnost párování berte s rezervou, ale pak se jedná o speciální případy, které také mají svou logiku.
Úvodní tag odpovídá předchozímu popisu textu mezi značkami menší a větší, ukončující tag má stejný obsah jako úvodní tag, ale za úvodní značkou < má znak lomítko /
tedy např. zápis údaje o názvu knihy by vypadal takto:

<nazev>Babička</nazev>

Páry tagů lze do sebe vnořovat do libovolné úrovně, tedy pro kompletní zápis o knize takto:

<kniha>
<nazev>Babička</nazev>
<autor>Němcová, Božena</autor>
<cislo>1</cislo>
<umisteni>velký pokoj</umisteni>
</kniha>

Abychom se ještě více přiblížili klasické databázi, musíme definovat soubor či tabulku, která obsahuje údaje o knihách - v našem případě to bude knihovna a zápis v XML bude obklíčením dalším tagem knihovna vypadat vysledně takto:

<knihovna>
<kniha>
<nazev>Babička</nazev>
<autor>Němcová, Božena</autor>
<cislo>1</cislo>
<umisteni>velký pokoj</umisteni>
</kniha>
</knihovna>

Tak a máme jakýsi polotovar připravený, chybí už jen hodně málo, aby to nějaký prohlížeč "sežral".
Dle závazných pravidel musí každý soubor v XML obsahovat řádek deklarace s definicí verze použitého XML a s definicí kódování použitého jazyka.
Detaily deklarace nebudu popisovat, stačí pro náš případ a češtinu v prohlížeči ve Windows zkopírovat následující řádek"

<?xml version="1.0" encoding="windows-1250"?>

Tento řádek je definiční a povinný na prvním řádku - je nepárový - tím se nemusíme starat o beztak zbytečný zápis posledního řádku souboru. - Kde soubor končí, tam je "konec světa".

Takže náš kompletní databázový soubor v jazyku XML s knihovnou a s jedinou knihou vypadá takto:


<?xml version="1.0" encoding="windows-1250"?>
<knihovna>
<kniha>
<nazev>Babička</nazev>
<autor>Němcová, Božena</autor>
<cislo>1</cislo>
<umisteni>velký pokoj</umisteni>
</kniha>
</knihovna>

Soubor můžete uložit na libovolné místo na disku pod libovolným názvem s příponou .xml a otevřít v prohlížeči Explorer či Mozilla-Firefox.

Zatím není vůbec jasné, co s tím, ale z prvního pohledu vyplývá:

VÝHODY:
- pro vytvoření databáze v XML jsme nepotřebovali žádný speciální program
- pro zápis programu stačí libovolný textový editor - i přes svoji jednoduchost je vhodný Poznámkový blok (Notepad) ve Windows, který vynikajícím způsobem provádí konverze mezi různými druhy kódování;
- není třeba definovat pevnou strukturu dat ani jejich platné rozsahy - vše záleží na dalším způsobu zpracování
- struktura i data jsou uloženy v jednom souboru (na rozdíl od klasických databázových systémů, kde jsou data ukládána odděleně od vlastní struktury, či popisu databáze
- žádný záznam nemá pevnou strukturu, je možné ho kdykoliv doplňovat či modifikovat
- struktura i data mají jednotnou koncepci a lze je využít vždy a všude - takže existuje univerzální přenositelnost i mezi různými počítačovými systémy.


NEVÝHODY
- proti databázovým systémům obsahuje zápis velmi mnoho nadbytečných (redundantních) informací, které však vyžaduje obecnost zadání bez počáteční definice struktury
- velká volnost v zadávání údajů může zlákat k vysoké složitosti výsledné struktury - ačkoliv se to z uvedeného příkladu nezdá, lze postupným vnořováním vytvořit takové schéma, které donutí k pláči i ty nejotrlejší - proto je třeba zachovávat určitou ukázněnost - např u jedné knihy lze uvést více autorů, jazyk, ve kterém, byla napsána, údaje o autorovi, odkazy na internetové stránky apod. - ALE údaje o jiné knize nemusí z toho obsahovat nic, nebo zase naprosto jiné speciální údaje;
- otázka rychlosti zpracování - proti klasickým databázovým systémům nemá tento systém ve svých odezvách šanci a je třeba ověřit, zda je při použité struktuře a rozsahu dat vůbec reálně využitelný
- vše je trvale uloženo ve vnitřní paměti, takže otázka kapacity paměti je velice podstatná.

Nakonec malá poznámka. Na Internetu jsem narazil na dotaz nějakého Američana, který prosil o pomoc, jak rozbalit a dešifrovat XML soubor, který má k dispozici, že se mu to nedaří...
Snad to není narušení cizích práv - zde je uvedená struktura, vzniklá prostým vnořováním, kterou nejsem schopen pochopit a ani to snad nechci. Gordické uzly nejsou právě mým koníčkem.
Do úryvku XML jsem pouze vložil úvodní deklaraci ?xml a zastřešující tagy <polozka> a </polozka>. Jinak je vše korektní. "Tak jak na to přátelé?" (opět citát z Cimrmana, ale pouze jako řečnická otázka, já sám žádné řešení nehledám, ale je možná zajímavé nahlédnout na strukturu XML pocházející z Nového světa.)
Vraťme se teď k našemu výše uvedenému příkladu.

Je uložený na našem serveru www.oplatek.cz a můžete si ho hned prohlédnout. odkazem na: knihovna1.xml


Uvidíte např. toto:



Na první pohled nic zajímavého.Jistě jste něco takového už někdy viděli, třeba jen náhodou při procházení Internetu. Znovu s Járou Cimrmanem: "Co tam s tím?"

Ale přece jenom určitý rozdíl tu je. Jak v barevnosti, tak v grafickém uspořádání.
Někdo s našimi daty něco provedl.
Je to právě zabudovaná funkce v prohlížečích, která:

- kontroluje syntaktickou správnost souboru XML. Pokud bude soubor obsahovat chybu, prohlížeč na vás nešetrně vybafne, ale dokonce vám napoví, kde zjistil chybu. Soubor s chybou prostě nepřijme. Myslím, že to už je velká přednost, že nebudeme dále pracovat s narušenými daty.

- grafické uspořádání ukazuje tzv. stromovou strukturu našich dat. Je zřejmé, že knihovně je podřízena kniha.

- u některých tagů se objevily červené pomlčky, resp. minusy. Stiskem myši na minusu můžete podřízenou větev sbalit - ( následně minus nahradí plus) a stiskem plusu podřízenou větev opět rozbalit.

Z toho je vidět, že s našimi daty už můžeme nějak pracovat, i když velice omezeným způsobem.

Mačkat minus a plus je trochu málo, to uzná každý.

Hledal jsem na internetu prohlížeče a editory XML. Buď neumím hledat nebo mám v mozku málo závitů. Stáhnul jsem dva nebo tři prograny nabízející mnoho funkcí, kterých já jsem ovšem nedorostl ani náhodou. Stále všichni autoři zdůrazňují možnost zobrazení stromové struktury.
Jako primitiv - já bych chtěl vidět data, jako např.v administrátoru MySQLAdmin ve formě nějaké tabulky "či co", když už jsem s takovým úsilím vecpal do XML jednu jedinou knihu Babička od Boženy Němcové. Je opravdu chyba u mě?, nebo u Boženy Němcové, u které tehdy podobně jako u postaviček Renčína "častokrát ani na Internet nebylo..."
Další editor se vychloubal nejen zobrazením stromu, ale i v textovém tvaru. K mému překvapení mi zobrazil to, co jsem do souboru pracně nadatloval.


Tak si říkám, hledám pořád programy zadarmo, co se, od toho dá očekávat? Není všechno jako MySQL, kde je poskytována obyčejným smrtelníkům opravdová kvalita a to zcela zdarma.

Společně s uhlobaronem ze hry Posel z Liptákova jsem změnil strategii podle jeho výroku "Mě budoucnost v naší branži zajímá, na to bych si rád připlatil!" A ejhle ceny značně vysoké, ale s příslibem, že programy dokáží všechno, i to co, si nejde ani představit! Na jednu Babičku od Boženy Němcové mi přišlo 500$ za "robustní implementaci" skoro dost.
Zobrazil jsem si v jednom Free programu poštovní úřady v ČR, v domění, že se třeba dozvím, kdy má otevřeno pošta v Kolíně v ulici Pod Hroby (u nádraží).
Dozvěděl jsem se následující ve stromové struktuře:
Posuďte sami:
Kolín jsem nenašel, dle mého názoru se hledat ani nedá, bůhví. Další program předvedl totéž v barevném rozbalovacím provedení, Kolín nikde, zůstal někde "pod hroby" stromové struktury. Ale navíc mi zobrazil celý textový soubor bez možnosti vyhledání zadaného slova. Na to tedy databázi nepotřebuji, stačí mi ten Notepad. Naopak se skláním před tvůrci programu MySQLAdmin, tam jsem schopen při svých daných duševních schopnostech najít všechno co potřebuji a aspoň v případě nutnosti opravit snadno nějaký překlep.
Nevzdávám, hledám dál. Už nenávidím položky typu ntElement - základního to typu v souborech XML, tento typ jsem nevědomky použil všude, aniž bych o tom měl tušení.

Nespočívá tedy velké rozšíření a úspěch jiných systémů v jejich snadnějším porozumění? Jenže bohužel jsem hned v úvodu určil, že žádný nadstavbový systém nechci.

Nechci vlastně ani stromovou strukturu, nahání mi totiž hrůzu. Snažíl jsem se v tom něco malilinko zkusit - byly to galeje. Je moc hezké, že se dá stromem elegantně procházet rekurzivními algoritmy - "Víte co je to rekurzivní algoritmus? Ne? Tak to ani nechtějte vědět!"
Je to něco jako v Hrabalových Postřižinách - chytne se vám kabát na motocyklu do sekundérního kolečka a vy jezdíte tak dlouho dokolečka, až dojde benzín. Pak vás snad někdo odveze - v lepším případě domů, v horším do ústavu
Mé tušení o významu XML však zůstává neotřeseno, jen hledám cestu, kudy na to, aby tato "potrava" byla trochu stravitelnější.
Jen se obávám, aby mé snažení neskončilo na hromadě odpadků z kuchyně, jako svého času defenestrovaní (tedy "vyoknění") místodržící Slavata, Martinic a písař Fabricius. Ti na tom aspoň později vydělali. A to pak začala velká třicetiletá mela, jak jsem kdysi zaslechl ve škole.

V příštím díle tohoto pojednání se pokusíme rozšířit knihovnu o více knih - ale to by bylo trochu málo. Pokud se vše podaří, měl by být k dispozici malý zkušební program, který uvedená data ve formátu XML jakž takž zobrazí v lidsky "stravitelné formě" bez nutnosti pochopení dalších rozsáhlých nadstaveb. A také se pokusíme opravdu najít v Kolíně tu poštu "Pod Hroby". Kupodivu to opravdu jde...