XML a databáze – pokročilé konstrukce XML-QL

    0

    Je to už nějaká doba, kdy se na Interval.cz objevil poslední článek o XML. Jazyk XML se neustále rozvíjí a s jeho použitím se dnes setkáváme stále častěji. Připravil jsem si pro vás zajímavý článek o tom, jak můžete s běžným XML dokumentem pracovat jako s databází. Seznámím vás se základy dotazovacích jazyků nad XML, a to zejména s jazykem XML-QL. Uvidíte, že nejde o nic těžkého a že příklady si budete moci sami vyzkoušet.

    XML dokumenty cestovní kanceláře

    Pro účely tohoto článku zadefinuji jednoduchý XML dokument, který bude zachycovat jednoduchou databázi klientů cestovní kanceláře. O každém klientovi si budu evidovat jeho jméno, příjmení, adresu, telefon, e-mail, číslo a jméno zájezdu, na který se přihlásil. Jednoduché DTD (o základech XML jste se mohli na Interval.cz dočíst zde) modelující tuto situaci bude vypadat v souboru zajezd.dtd takto:

    <!ELEMENT CESTOVKA (KLIENT+)>
    <!ELEMENT KLIENT (JMENO, PRIJMENI, ADRESA, TELEFON, E_MAIL?, ZAJEZD)>
    <!ELEMENT JMENO (#PCDATA)>
    <!ELEMENT PRIJMENI (#PCDATA)>
    <!ELEMENT ADRESA (ULICE, CISLO, MESTO, PSC)>
    <!ELEMENT TELEFON (#PCDATA)>
    <!ELEMENT E_MAIL (#PCDATA)>
    <!ELEMENT ZAJEZD (#PCDATA)>
    <!ELEMENT ULICE (#PCDATA)>
    <!ELEMENT CISLO (#PCDATA)>
    <!ELEMENT MESTO (#PCDATA)>
    <!ELEMENT PSC (#PCDATA)>
    <!ATTLIST KLIENT ID CDATA #IMPLIED>
    <!ATTLIST ZAJEZD ID CDATA #IMPLIED>

    Následuje jednoduchý XSL dokument, který definuje vzhled zobrazení adresáře např. v prohlížeči (který ovšem umí interpretovat XML). Soubor zajezd.xsl definuje, jak se jednotlivé části XML dokumentu „dosadí“ do struktury HTML stránky. V našem případě vytvoří seznam seznamů (tj. využití <OL> a <UL>).

    <?xml version=“1.0″ encoding=“windows-1250″ standalone=“yes“ ?>
    <xsl:stylesheet xmlns:xsl=“http://www.w3.org/TR/WD-xsl“>
    <xsl:template match=“/“>
    <HTML> <HEAD><TITLE>Cestovka</TITLE></HEAD>
    <BODY><xsl:apply-templates/></BODY>
    </HTML>
    </xsl:template>
    <xsl:template match=“CESTOVKA“>
    <OL>
    <xsl:apply-templates/>
    </OL>
    </xsl:template>
    <xsl:template match=“KLIENT“>
    <LI>
    <UL>
    <xsl:apply-templates/>
    </UL>
    </LI>
    </xsl:template>
    <xsl:template match=“JMENO|PRIJMENI|ADRESA|TELEFON|E_MAIL|ZAJEZD“>
    <LI><xsl:apply-templates/></LI>
    </xsl:template>
    <xsl:template match=“ULICE|CISLO|MESTO|PSC“>
    <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match=“text()“>
    <xsl:value-of/>
    </xsl:template>
    </xsl:stylesheet>

    Nyní mám připravené oba základní důležité soubory – jeden popisuje logickou strukturu (tj. datový model – databázi) a druhý popisuje vzhled, jak se data z databáze zobrazí. Třetím souborem jsou vlastní data, tedy databáze. Její obsah je uložen v souboru zajezd.xml:

    <?xml version=“1.0″ encoding=“windows-1250″ standalone=“yes“ ?>
    <?xml-stylesheet type=“text/xsl“ href=“zajezd.xsl“ ?>
    <!DOCTYPE CESTOVKA SYSTEM „zajezd.dtd“>
    <CESTOVKA>
    <KLIENT ID=“1″>
    <JMENO>Jaromír</JMENO>
    <PRIJMENI>Skřivan</PRIJMENI>
    <ADRESA>
    <ULICE>Novákova</ULICE>
    <CISLO>17</CISLO>
    <MESTO>Brno</MESTO>
    <PSC>60200</PSC>
    </ADRESA>
    <E_MAIL>jaromir.skrivan@interval.cz</E_MAIL>
    <ZAJEZD ID=“556″>Dolomity</ZAJEZD>
    </KLIENT>
    <KLIENT ID=“2″>
    <JMENO>Jana</JMENO>
    <PRIJMENI>Nováková</PRIJMENI>
    <ADRESA>
    <ULICE>Strašilova</ULICE>
    <CISLO>156</CISLO>
    <MESTO>Praha</MESTO>
    <PSC>15000</PSC>
    </ADRESA>
    <E_MAIL>j_novakova@nekde.cz</E_MAIL>
    <ZAJEZD ID=“557″>Korsika</ZAJEZD>
    </KLIENT>
    <KLIENT ID=“3″>
    <JMENO>Petr</JMENO>
    <PRIJMENI>Dvořák</PRIJMENI>
    <ADRESA>
    <ULICE>Hudebníčkova</ULICE>
    <CISLO>1174</CISLO>
    <MESTO>Praha</MESTO>
    <PSC>11000</PSC>
    </ADRESA>
    <E_MAIL>dvorak127@kdekoliv.com</E_MAIL>
    <ZAJEZD ID=“556″>Dolomity</ZAJEZD>
    </KLIENT>
    </CESTOVKA>

    V souboru jsou uloženi celkem 3 klienti cestovní kanceláře. Nad tímto souborem budu demonstrovat použití dotazovacího jazyka.

    Dotazovací jazyky nad XML

    Dotazovacích jazyků nad XML je celá řada. Liší se od sebe stupněm propracovanosti a zejména vyjadřovací silou. Dotazovací jazyk nad XML daty by měl splňovat několik požadavků, aby měl vůbec rozumnou šanci se uchytit a být používán. Zejména by měl být zaručen mocný přístup ke strukturovaným datům podobně jako v dosud zavedeném SQL, dále možnost vyhledávání pomocí klíčových slov a použití uživatelem definovaných funkcí, které umožní např. generovat automaticky určité části dokumentů, apod.

    Příklady dotazovacích jazyků mohou být např. XSL, který v oblasti dotazování má slabší vyjadřovací sílu a spíše se používá pro definici vzhledu zobrazení XML dat. Dalšími jazyky jsou XML-QL, XQL, X2QL. Na přední místo bych právě dal jazyk XML-QL (XML Query Language), který je již docela propracován a v němž je vidět realizace uvedených požadavků na dotazovací jazyky.

    XML-QL

    Sami uvidíte, že tvorba dotazů v XML-QL je velice jednoduchá a že je trochu blízká SQL. XML-QL dotaz se skládá ze dvou základních částí: první část – dotazovací – specifikuje vlastní dotaz a druhá část – konstrukční – definuje strukturu vrácených dat, která splnila podmínky dotazu. Na následujících příkladech se pokusím vysvětlit jednoduché použití jazyka XML-QL.

    Příklady

    První příklad: chceme e-mailovou adresu Jaromíra Skřivana:

    where <CESTOVKA>
            <KLIENT>
            <JMENO>Jaromír</JMENO>
            <PRIJMENI>Skřivan</PRIJMENI>
            <E_MAIL>$m</E_MAIL>
            </KLIENT>
            </CESTOVKA> in „zajezd.xml“
    construct $m

    Odpověď na tento dotaz bude následující:

    <XML>jaromir.skrivan@interval.cz</XML>

    V části where se zapíšou XML značky přesně tak, aby odpovídaly XML značkám v základním dokumentu. Selekci podle hodnoty nějakého tagu provedeme tak, že tag s obsahem zapíšeme. Naopak, hodnoty, které chceme dotazem vrátit, zapíšeme její tagy a mezi ně uvedeme nějakou tzv. vazební proměnou, která je tvaru $identifikátor. Na tuto vazební proměnnou se pak odkazujeme v části construct. Všechny tagy samozřejme se musí zapsat párově. Není třeba uvádět všechny tagy, ty hodnoty, které nás nezajímají, jednoduše neuvedeme. Za posledním uzavíracím tagem v části where následuje klíčové slovo in, za nímž je uveden název XML souboru, ze kterého se budou brát data.

    Druhý příklad je už složitější. Chceme jména a příjmení všech klientů, kteří pojedou do Dolomit:

    where <CESTOVKA>
            <KLIENT>
            <JMENO>$j</JMENO>
            <PRIJMENI>$p</PRIJMENI>
            <ZAJEZD ID=“556″>Dolomity</ZAJEZD>
            </KLIENT>
            </CESTOVKA> in „zajezd.xml“
    construct <DOLOM_KLIENT>
            <JMENO>$j</JMENO>
            <PRIJMENI>$p</PRIJMENI>
            </DOLOM_KLIENT>

    Oproti předchozímu je rozšířena část construct. Nemusí se nutně vracet jenom hodnoty prostřednictvím vazebních proměnných, ale můžeme vracet stejnou nebo dokonce i jinou XML strukturu. Tento dotaz nám vrátí dva XML záznamy, konkrétně

    <XML>
    <DOLOM_KLIENT>
    <JMENO>Jaromír</JMENO>
    <PRIJMENI>Skřivan</PRIJMENI>
    </DOLOM_KLIENT>
    <DOLOM_KLIENT>
    <JMENO>Petr</JMENO>
    <PRIJMENI>Dvořák</PRIJMENI>
    </DOLOM_KLIENT>
    </XML>

    které lze dále jakýmkoliv způsobem strojově zpracovat. Tyto dva uvedené příklady představují dotazy typu „porovnávání vzorků“. Tyto dotazy představují nejjednodušší použití XML-QL. Abyste si tyto příklady mohli vyzkoušet potřebujete mít nainstalovaný XML-QL interpret, který si můžete stáhnout např. na stránkách reseach.att.com.

    Starší komentáře ke článku

    Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

    Žádný příspěvek v diskuzi

    Odpovědět