XML - máte co jste chtěli

30. 5. 2001
Doba čtení: 7 minut

Sdílet

Po delší odmlce je tu další díl seriálu o XML. Dnešní díl bude (na vaše přání) čistě praktickou záležitostí. Podíváme se na modelový příklad využití XML v praxi.

Úvodem bych chtěl upozornit, že nastíněný modelový příklad a jeho řešení jsem vytvořil z důvodů čistě didaktických a zaměřil jsem se hlavně na problematiku práce s XML. Pokud tedy shledáte, že uvedené programy a postupy jsou neefektivní, špatně ošetřené proti případným chybám apod., je to většinou z důvodu přehlednosti a názornosti. A nyní již k práci samotné.

Představte si, že jste se rozhodli rozjet vlastní internetový magazín, který se bude zabývat recenzováním hardwaru a jeho podpory v Linuxu – říkejme mu např. BOOT.CZ (veškerá podobnost s jakýmkoli existujícím názvem je čistě náhodná :) ). Podobně jako na ROOTu očekáváte poměrně rozsáhlou skupinu přispěvatelů a chtěli byste si nějak usnadnit kontrolu formálního uspořádání dodávaných článků a zároveň i jejich další zpracování. A protože jsem Vás v předchozích článcích přesvědčil o úžasných možnostech XML :), rozhodli jste se, že půjdete právě touto cestou. Co tedy musíte udělat?

  1. Vytvořit DTD
  2. Napsat podle něj články
  3. Vytvořit program pro generování souhrné úvodní stránky z dodaných článků
  4. Vytvořit XSLT stylesheety pro převod článků a úvodní stránky do (X)HTML

DTD

Jako první věc doporučuji navrhnout si DTD pro Vaše články. DTD popisuje strukturu dokumentů a umožňuje snadnou kontrolu jejího formálního dodržování. Každý autor pak dostane jeho kopii a na něm již bude, aby odevzdal článek, který mu bude odpovídat. Lze tak např. zaručit, že každý článek bude mít uveden název, jméno autora, obsah a závěr. Při tvorbě DTD doporučuji dodržovat následující pravidla:

  • pokuste se vytvořit takový dokument a takové značky, aby byl pro ostatní co nejčitelnější
  • snažte se strukturu dokumentu popsat natolik detailně, abyste nepřišli o žádné informace
  • pokuste se o co nejjednodušší model dokumentu, ale zároveň se snažte zbytečně neomezovat pravidla tam, kde to není žádoucí
  • vyzkoušejte si DTD v praxi (obzvlášť pokud nejste v jejich tvorbě příliš zkušení). Pokud DTD rozšíříte mezi autory, bude už o mnoho složitější ho opravovat a updatovat

Pro účely našeho příkladu jsem vytvořil toto DTD. Všimněte si použití entit (ENTITY) – v našem případě jde o cosi jako proměnnou typu String, která je posléze kdekoliv v DTD nahrazena odpovídajícím textem. Lze si tak v mnoha případech zjednodušit práci, zpřehlednit výsledné DTD a také zvýšit jeho modularitu – např. k přidání nových formátovacích tagů (např. sup pro horní index) bude v našem případě stačit změna v deklaraci entity html_like, zatímco jinak bychom museli projít celé DTD a doplnit ho všude, kde bude třeba.

Alternativní možností, jak poskytnou autorovi formátování pomocí (X)HTML, je zahrnout jeho DTD do našeho DTD pomocí entity jako u tohoto DTD. Tímto způsobem jsme automaticky vložili do našeho DTD všechny značky popsané v XHTML-strict. Můžeme tak tedy snadno znovu použít již hotový kód. (I když bude naše DTD obsahovat definici všeho z XHTML, použitelné bude pouze to, co je nějakým způsobem spojeno s naším root-elementem – tedy boot. Na druhé straně, pokud bychom jako root-element použili html, získáme tak DTD pro XHTML. Výběr root-elementu je dán deklarací <!DOCTYPE root-element SYSTEM „file“> v našem XML dokumentu.)

V dalším budeme předpokládat použití prvního DTD a v některých případech se pouze zmíníme o možnosti řešení v případě použití druhého způsobu.

S takto vytvořeným DTD se můžeme vrhnout na psaní vlastních článků. Další výhodou, kterou nám v této chvíli přináší DTD kromě možnosti kontroly formátování dokumentů, je možnost použití některého z „chytrých“ XML editorů (např. Emacs), který nám dodržování daného formátování v mnohém usnandní. Pro didaktické účely jsem vytvořil tři kraťoučké článečky – 1, 2 a 3 se kterými budeme dále pracovat. Kódování těchto souborů je UTF-8, které je v oblasti XML standardem. Pokud nemůžete z nějakého důvodu psát přímo v UTF-8, můžete si stáhnout např. tyhle skriptíky pro konverzi iso-8859–2 do utf-8 a zpět.

Trocha programování

Dalším krokem bude vytvoření úvodní stránky s odkazy na jednotlivé články a převedení článků z XML podoby do (X)HTML pro jejich publikaci na webu. Pro tento účel využijeme jednoho krátkého prográmku, na kterém si ukážeme, jak s XML pracovat z pohledu programátora, a XSLT, které je pro tuto práci přímo stvořené (a to doslova :)).

Program, který pro nás vytvoří souhrn všech článků obsahující názvy článků, jména autorů a jména souborů ve kterých se články nacházejí, jsem napsal v Pythonu (testováno na verzích 2.0 a 2.1 – na starších nebude fungovat) . Python má pro tento účel hned několik výhod – programy jsou snadno čitelné (a to i pro člověka, který Python nezná), všechny použité knihovny pro práci s XML jsou od verze 2.0 součástí standardní distribuce, a v neposlední řadě je to můj oblíbený programovací jazyk :). Činnost programu boot.py je myslím dostatečně popsána v komentářích (začínají ##, nebo jsou v dokumentačním textu k funkcím, který je uveden hned pod jejich hlavičkou). Výstupem programu je XML dokument, který dále převedeme do XHTML pomocí tohoto stylesheetu (o XSLT viz. níže).

Pro práci s XML náš program využívá hned dvě nejrozšířenější rozhraní – DOM a SAX. DOM je zkratka anglického „Document Object Model“, z čehož je zřejmé, že toto rozhraní přistupuje k XML dokumentu objektovým způsobem. Z XML souboru je v paměti počítače vytvořena jeho reprezentace v podobě objektu, jehož metody slouží pro další práci s daty. Struktura dokumentu je vyjádřena hierarchií dílčích objektů, jako jsou např. „element“, „attribute“ apod.

SAX pochází z anglického „Simple Api to XML“ a jak název napovídá, jde o velmi jednoduchý (ale mocný) nástroj pro práci s XML. Jde v podstatě o parser, který prochází XML dokument a volá rozdílné metody objektu typu DocumentHandler, podle toho, na co narazí – např. při začátku tagu, konci tagu, čtení obsahu tagu apod. – a předává jim výsledky svého hledání. Je na nás, abychom tento objekt implementovali a naučili ho tak, co se bude konkrétně dít. Výhodou SAXu je, že neudržuje v paměti celý XML dokument (jako DOM) ale pouze právě čtenou část. Je tedy vhodnější pro obsluhu velkých XML dokumentů (obzvlášť pokud z nich chceme použít pouze část dat). V neposlední řadě je také rychlejší.

V našem modelovém příkladu jsem z didaktických důvodů použil obě možnosti – SAX pro čtení vstupních souborů a DOM pro zapsání výsledku.

XSLT

Pro „překlad“ našeho XML dokumentu do XHTML použijeme krátký XSLT stylesheet. Jeho funkce je myslím dostatečně popsána v komentářích. Jako XSLT procesor vřele doporučuji Xalan-C. Jde o klon Xalanu napsany v C++ namísto Javy, což přispělo k obrovskému zrychlení transformace (podle mých testů je XalanC min. 4× rychlejší než nejrychlejší XSLT procesory napsané v Javě, jako např. Saxon; většinou je však ten náskok ještě daleko patrnější. (Pro příznivce Javy – není to dáno jen tím, že u Javy musí nejdříve naběhnout VM – dělal jsem i transformace, které trvaly kolem pěti minut, kde by měl být tento efekt již eliminován)).

Zmíněný XSLT stylesheet je dostačující pro překlad dokumentů založených na prvním DTD, v němž jsme explicitně vypsali použitelné formátovací značky. Při použití druhého DTD by však bylo výhodnější vytvořit společnou šablonu (né templát, já vím :), která všechny tagy, které jsou shodné v originále i v překladu, pouze zkopíruje bez nutnosti vytvářet pro každý z nich samostatnou šablonu. Řešení je jednoduché – stačí

<xsl:template match="p | b | i | u">

přepsat na

<xsl:template match="*">

Mohlo by se zdát, že tento postup nebude fungovat, protože tak vytvoříme šablonu pro všechny tagy a ne jen pro ty dosud nepopsané. Ve skutečnosti však tento stylesheet funguje správně, neboť XSLT procesor se při aplikaci šablon řídí pravidlem, že pro každý element použije tu šablonu, která je nejkonkrétnější. Např. pro element „/beda/root/xml“ se použije šablona určená pro „/beda//xml“ a ne šablona „xml“ nebo „/*/xml“. Toho lze s výhodou použít právě pro ošetření tagů, o jejichž výskytu předem nevíme, a nebo je jejich zdroj i výstup stejný. Více o řešení konfliktů templátů lze nalézt na stránkách <a href=„http:ww­w.w3.org/TR/xslt­.html#conflic­t“>W3C o XSLT

Závěr

Na závěr nám již zbývá jen dát to vše dohromady – nejlépe v nějakém krátkém skriptu – a vše je hotovo. Nyní již stačí jen nasměrovat prohlížeč na výstup a přesvědčit se, že vše proběhlo v pořádku.

Všechny soubory odkazované v tomto článku najdete pěkně pohromadě zde.

bitcoin_skoleni

A to je pro dnešek vše. Příštím dílem seriál o XML uzavřeme.

Tento článek bych rád věnoval památce Douglase Adamse.

Autor článku

Bedřich Košata je vedoucím Laboratoří CZ.NIC, výzkumného a vývojového centra sdružení CZ.NIC, správce české národní domény.