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

11. července 2001

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.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *