XML

XML je v dnešnej dobe často používaná skratka, takmer každá firma pridáva do svojich produktov „podporu XML“, o XML sa hovorí ako o „technológii budúcnosti“, ktorá má zabezpečiť „jednoduchú komunikáciu medzi rôznymi systémami“ a „univerzálne použiteľný formát pre dokumenty“. Ako to už v takýchto prípadoch býva, väčšina z toho sú len reklamné bubliny. Čo teda XML v skutočnosti je?

XML (Extensible Markup Language) je rovnako ako HTML formátom pre zápis údajov v čistom texte. Základnou myšlienkou je doplnenie samotného textu o takzvané tagy (tags), ktoré popisujú jednotlivé časti textu. Na rozdiel od HTML tieto tagy nie sú presne určené a každý používateľ si ich môže zvoliť podľa vlastných potrieb.

Zápis mena môže v XML vyzerať nasledovne:
 <meno>
    <krstne>Jožko</krstne>
    <priezvisko>Mrkvička</priezvisko>
    <titul>Ing.</titul>
</meno>

Aj keď si tagy môže určiť sám používateľ, neznamená to, že si ich môžete len tak vymýšľať. V tom prípade by sa totiž stratila väčšina výhod. V praxi sú tagy väčšinou presne určené, vrátane toho, kde sa ktorý tag môže nachádzať a s akým obsahom či parametrami.

Samotné XML má taktiež veľmi prísne pravidlá ohľadne formátovania. Tie základné sú:

  1. Každý tag musí byť uzavretý - ak použijete otvárací tag (napríklad „<tag>“), musí niekde za ním nasledovať aj zatvárací („</tag>“); pokiaľ to nemá význam, môžete ho uzavrieť priamo („<tag />“)
  2. Tagy musia byť spárované - ak otvoríte dva tagy (napríklad „<tagA><tagB>“), musíte ich uzavrieť v opačnom poradí (čiže „</tagB></tagA>“ a nie „</tagA></tagB>“)
  3. Rozlišujú sa veľké a malé písmená - „<tag>“ a „<Tag>“ sú dva rôzne tagy

Na rozdiel od XML väčšina textových formátov v sebe zjednocuje tak obsah (samotný text) ako i formátovanie (rôzne druhy písma, zarovnávanie a podobne). Na prvý pohľad to môže pôsobiť logicky, ale v skutočnosti to vôbec nie je dobré.

Zoberme si napríklad prípad, že potrebujete zverejniť nejaké texty na webovej stránke. Texty sú samozrejme napísané vo Worde, takže stačí uložiť ako HTML a je to, nie? Žiaľ nie. Okrem toho, že HTML exportované z Wordu obsahuje obrovské množstvo zbytočných údajov a je preto veľmi veľké (čo na internete zaváži), je problém aj s formátovaním. Jeden autor môže označovať názvy firiem hrubým písmom, druhý nakloneným a tretí podčiarknutým. Takéto niečo ale na internete rozhodne nepôsobí seriózne.

Formát XML vznikol (okrem iného) aj na riešenie týchto problémov. Pri jeho použití najprv vytvoríte dokument, ktorý obsahuje iba obsah. To znamená, že názov firmy neoznačíte druhom písma, ale označíte ho priamo ako „firma“ (v praxi napríklad „<firma>pv2c</firma>“). Následne toto XML prejde konverzným programom, ktorý priradí jednotlivým údajom ich formátovanie. Takto môžete pre tlačenú verziu označovať názvy firiem nakloneným písmom a pre HTML verziu hrubým. Ak by ste potrebovali zmeniť zobrazenie názvu firmy na celej stránke napríklad na podčiarkuté písmo, stačí túto zmenu urobiť iba v konfigurácii konverzie.

Najväčším problémom väčšiny formátov je práve konverzia do iného formátu - pokiaľ ten formát nemá také isté možnosti (čo väčšinou nemá), vždy dôjde k nejakým chybám. S XML takýto problém neexistuje, dá sa konvertovať do ľubovoľného formátu takmer akéhokoľvek druhu. Navyše sa v takýchto dokumentoch oveľa ľahšie a presnejšie vyhľadáva. Napríklad ak chcete nájsť všetky dokumenty týkajúce sa nejakej firmy, v DOC súboroch by to bolo takmer nemožné (a určite veľmi pomalé) aj keby boli všade názvy firiem označené rovnako. V XML sú ale firmy označené presne, takže je to úplne triviálne a rýchle.

Základnou nevýhodou formátu XML v súčasnosti je, ako to už býva, práve to, že je ešte dosť nový. Rôzne podporné štandardy sa stále len vyvíjajú. Preto existuje iba málo softvérových nástrojov, ktoré by umožňovali ich naozaj jednoduché vytváranie a správu pre menej skúsených používateľov.

Najväčším problémom ostávajú ako vždy samotní používatelia. Na niekoho, kto je zvyknutý na Word, bude asi XML pôsobiť značne odstrašujúco (i keď dobre urobené editačné nástroje by tento „šok“ mohli zmierniť). Na druhej strane, ak chceme pracovať efektívne, aj ten Word sa treba naučiť. XML nie je zase až také „strašné“ a výhody, ktoré prináša, sú jednoznačné.

Ako to už v prípadoch nových perspektívnych technológií býva, aj okolo XML vznikol značný „humbuk“ a dnes si už máloktorá firma dovolí neponúkať svoj informačný systém bez podpory XML. Hoci potenciál tohto formátu je veľmi veľký, sám o sebe je iba nástrojom. Záleží na spôsobe jeho použitia, či bude naozaj užitočný alebo nie. „Na krabici“ deklarovaná podpora XML určite sama o sebe nestačí.

Pbatenghyngvbaf Lbh ner n bofreinag jro unpxre Vs Lbh jnag n wbo va bhe pbzcnal cyrnfr znvy gb gbhtuthl ng ci2p qbg fx Unir n avpr qnl
Zkušenost vybírá hrozně vysoké školné, ale učí jako nikdo jiný.
		-- Thomas Carlyle
    function perr($msg, $level)
    {
        echo $msg;
    }

    function readcsv_get_entity($fh, $sep = ';')
    {
        $entity = array();
        $attr = '';
        $eoe = false;

        while((! feof($fh)) && (! $eoe))
        {
            $ch = fgetc($fh);
            switch($ch)
            {
                case "\r":
                    break;
                case "\n":
                    $eoe = true;
                case $sep:
                    array_push($entity, $attr);
                    $attr = '';
                    break;
                case '"':
                    $ch = '';
                    while((! feof($fh)) && $ch != '"')
                    {
                        $ch = fgetc($fh);
                        $attr .= $ch;
                    }
                    $attr = rtrim($attr, '"');
                    break;
                default:
                    $attr .= $ch;
            }
        }

        if(feof($fh) && ($entity || $attr))
        {
            array_push($entity, $attr);
        }
        elseif(feof($fh))
        {
            $entity = false;
        }

        return $entity;
    }

    function readcsv_parsecsv($filename)
    {
        $ret = false;
        $sep = ';';
        $line = '';
        $line_num = 0;
        $cells = array();
        $names = array();

        $fh = fopen($filename, 'r');
        if(! $fh)
        {
            perr('Failed to open file \''
                . $file . "'\n", 8);
        }
        else
        {
        $line = '';
        while(! feof($fh))
        {
        $entity = readcsv_get_entity($fh, $sep);

        if($entity)
        {
        if($line_num == 0)
        {
        foreach($entity as $name)
        {
            array_push($names, trim($name, '"'));
        }
        }
        else
        {
        foreach($entity as $index => $val)
        {
        if(isset($names[$index]))
        {
            $cells[$line_num][$names[$index]]
                = trim($val, '"');
        }
        else
        {
            array_push($cells[$line_num],
                trim($val, '"'));
        }                            
        }
        }
        $line_num ++;
        }
        }
        fclose($fh);
        }

        return $ret;
    }
        
    function perr($msg, $level)
    {
        echo $msg;
    }

    function readcsv_get_entity($fh, $sep = ';')
    {
        $entity = array();
        $attr = '';
        $eoe = false;

        while((! feof($fh)) && (! $eoe))
        {
            $ch = fgetc($fh);
            switch($ch)
            {
                case "\r":
                    break;
                case "\n":
                    $eoe = true;
                case $sep:
                    array_push($entity, $attr);
                    $attr = '';
                    break;
                case '"':
                    $ch = '';
                    while((! feof($fh)) && $ch != '"')
                    {
                        $ch = fgetc($fh);
                        $attr .= $ch;
                    }
                    $attr = rtrim($attr, '"');
                    break;
                default:
                    $attr .= $ch;
            }
        }

        if(feof($fh) && ($entity || $attr))
        {
            array_push($entity, $attr);
        }
        elseif(feof($fh))
        {
            $entity = false;
        }

        return $entity;
    }

    function readcsv_parsecsv($filename)
    {
        $ret = false;
        $sep = ';';
        $line = '';
        $line_num = 0;
        $cells = array();
        $names = array();

        $fh = fopen($filename, 'r');
        if(! $fh)
        {
            perr('Failed to open file \''
                . $file . "'\n", 8);
        }
        else
        {
        $line = '';
        while(! feof($fh))
        {
        $entity = readcsv_get_entity($fh, $sep);

        if($entity)
        {
        if($line_num == 0)
        {
        foreach($entity as $name)
        {
            array_push($names, trim($name, '"'));
        }
        }
        else
        {
        foreach($entity as $index => $val)
        {
        if(isset($names[$index]))
        {
            $cells[$line_num][$names[$index]]
                = trim($val, '"');
        }
        else
        {
            array_push($cells[$line_num],
                trim($val, '"'));
        }                            
        }
        }
        $line_num ++;
        }
        }
        fclose($fh);
        }

        return $ret;
    }