Při programování v ASP jistě používáte nějakou databázi pro ukládání dat. XML je jedním z formátů pro uchovávání dat. Výhodou XML je fakt, že je přijímán velkou částí počítačového průmyslu a překonává tudíž propasti mezi jednotlivými platformami. Za svých pět let života (10. února bylo XML opravdu pět let) se tento formát stal velmi populárním. Nebudu vysvětlovat, co a proč je XML, ale jak je možné k dokumentům v XML přistupovat.

DOM (Document Object Model)

Je několik způsobů, jak můžete využít XML ve svých aplikacích a jednou z nich je použití DOM. Budu se zde zabývat pouze DOM, ale to neznamená, že by bylo jedinou možností, jak vydolovat z dokumentů XML data. Ve skutečnosti stojí DOM zhruba uprostřed mezi low-level a high-level API. Hlavní konkurent DOM je SAX (Simple API for XML).

Přehled rozhraní MSXML

DOM a MSXML nabízí pohled na dokument jako na strom složený z uzlů. Kořenem stromu je pak prvek na nejvyšší úrovni. Podívejte se na následující obrázek:

Strom dokumentu XML

Objekt Document dostanete po vytvoření nové instance parseru. Tento objekt vám umožňuje ovládat chování parseru a vytvářet nové uzly. Element documentElement je kořenem dokumentu a stojí na samém začátku při průchodu dokumentem XML. Všechny ostatní položky, které v XML dokumentu najdete, jsou už jen uzly (nodes). Mezi uzly navzájem platí vztah rodič-potomek, to znamená, že každý uzel má svůj rodičovský uzel (parentNode). Pokud si tento vztah popíšeme na našem obrázku, pak platí, že:

  • element A má dva potomky (childNodes) – B a C
  • element B nemá žádného dalšího potomka, ale má rodičovský uzel (parentNode) A
  • element C má tři potomky – D, E a F a má rodičovský uzel A

Nyní se podíváme na některé objekty a vlastnosti umožňující pohyb po uzlech. Nejdříve přehled objektů:

Objekt Popis
Node Jednoduchý uzel v hierarchii.
NodeList Sada uzlů.
NamedNodeMap Sada uzlů, umožňující přístup jak podle jména, tak i podle indexu.

Nyní jsou na řadě vlastnosti umožňující pohyb po uzlech:

Vlastnost Popis
childNodes Vrátí NodeList se všemi potomky uzlu.
firstChild Vrátí prvního potomka aktuálního uzlu.
lastChild Vrátí posledního potomka aktuálního uzlu.
parentNode Vrátí rodičovský uzel aktuálního uzlu.
previousSibling Vrátí předchozí uzel na stejné úrovni v hierarchii.
nextSibling Vrátí následující uzel na stejné úrovni v hierarchii.
nodeName Vrátí název uzlu.
nodeValue Vrátí hodnotu uzlu.

Abychom mohli aktivně pracovat s dokumentem, potřebujeme k tomu také metody. Uvádím jen ty nejpoužívanější:

Metoda Popis
hasChildNodes Vrátí True, jestliže má uzel další děti.
load(URL) Načte do paměti dokument, který najde na adrese URL. Pokud nastane chyba, bude documentElement=NULL.
selectSingleNode(nazev) Nastaví uzel nazev jako aktuální uzel.

Využití v praxi

Myslím, že teorie už bylo dost. Je čas podívat se, jak to všechno v ASP skriptech využít. Předem upozorňuji, že skripty, které zde používám, neobsahují žádné ošetření případných chyb, takže dokumenty musejí být správně napsané. Při každém druhém pokusu napojit se na dokument XML jsem narážel na chybu, která hlásila, že je vyžadován objekt rootNode nebo něco podobného. Když se mi to stalo poprvé, málem jsem se zhroutil. Ve skutečnosti byla chyba pouze v samotném dokumentu XML, konkrétně jsem neměl správně zapsaný koncový tag u jednoho z elementů. Zmiňuji zde tento problém, protože se dá předpokládat, že se s ním také setkáte.

Ale nyní už slibovaný praktický příklad. Nejdříve musíte mít nějaký dokument:

<?xml version=“1.0″ encoding=“iso-8859-2″?>
<links>
 <link>
  <nazev>Interval.cz</nazev>
  <url>www.interval.cz</url>
 </link>
 <link>
  <nazev>W3C</nazev>
  <url>www.w3c.org</url>
 </link>
</links>

Ještě se pozastavím u prvního řádku. Pokud byste vynechali atribut encoding, váš skript by skončil chybou, pokud by se v dokumentu vyskytl nějaký nestandardní znak, například háčky, čárky a podobně. Ale podívejme se, jak využít ASP k získání informací z tohoto dokumentu. Vytvoříme stránku, která si najde názvy stránek a jejich URL a odešle prohlížeči klasické HTML:

<%@ Language=VBScript %>
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
dim objXML, objLink,objRootElement, strNazev, strURL, i
‚nejdrive vytvorime instanci objektu objXML
Set objXML = Server.CreateObject(„Microsoft.XMLDOM“)
‚nahrajeme dokument do pameti
objXML.load(Server.MapPath(„links.xml“))
‚vytvorime uzel pro koren souboru XML
Set objRootElement = objXML.documentElemen
‚projdeme cely dokument a ziskame vsechny odkazy
For i = 0 To objRootElement.childNodes.length – 1
 strNazev = objRootElement.childNodes.item(i).childNodes.item(0).text
 strURL = objRootElement.childNodes.item(i).childNodes.item(1).text
 Response.Write(„<a href=“““ & strURL & „““>“ & strNazev & „</a><br>“)
Next
Set objXML = nothing
%>
</BODY>
</HTML>

Pokud ovládáte HTML a ASP, není pro vás problémem přizpůsobit koncový vzhled svým představám. Můžete kombinovat client-side a server-side skripty k dosažení zajímavých efektů, tento jednoduchý příklad pouze naznačuje, jak s XML pracovat v ASP.

XML-brain aneb slavný settings.xml

Kombinace XML a ASP se velmi často používá k uchování základních informací o webu. Hodně ASP aplikací využívá tzv. XML-brain (settings.xml) k řízení základního vzhledu celého sídla. V tomto souboru se uchovávají například informace o barevném schématu nebo o adresách podstránek, případně o autorovi a podobně. Pokud se například rozhodnete přidat odkaz do svého menu, pak nemusíte měnit všechny stránky, ale zasáhnete pouze do tohoto jediného souboru. Je zbytečné vytvářet pro tento účel speciální databázi (pokud nehodláte tvořit sídlo velikosti několika set stránek).

Následující příklad ukazuje, jak by mohla vypadat reálná aplikace a jak se dá pracovat s informacemi, které získáte z XML. Jednotlivé hodnoty se budou ukládat do aplikačních proměnných. Nejdříve si tedy vytvořte XML-brain – settings.xml a uložte ho do podsložky admin:

<?xml version=“1.0″ encoding=“8859-2″?>
<settings>
 <links>
  <link url=“default.asp“>Úvodní stránka</link>
  <link url=“kontakt.asp“>Kontakt</link>
  <link url=“novinky.asp“>Novinky</link>
 </links>
 <basics>
  <autor>Pepa Novák</autor>
  <title>XML a ti druzí</title>
  <header_image>logo.png</header_image>
 </basics>
</settings>

V settings.xml můžete uchovávat mnohem více informací, to je však materiál na jiný článek. Cílem tohoto článku je předvedení extrakce dat. Připravte si tedy soubor global.asa:

sub application_onStart
strSourceFile = Server.MapPath(„admin“) & „\settings.xml“
Set objXML = Server.CreateObject(„Microsoft.XMLDOM“)
objXML.load(strSourceFile)
Set objRootLinks = objXML.documentElement.selectSingleNode(„links“)
Set objRootBasics = objXML.documentElement.selectSingleNode(„basics“)
‚ziskame odkazy na podstranky
For i = 0 to objRootLinks.childNodes.length – 1
 Application(„menuUrl“ & i + 1) = rootLinks.childNodes.item(i).getAttribute(„url“)
 Application(„menuText“ & i + 1) = rootLinks.childNodes.item(i).text
Next
‚ulozime si pocet polozek naseho menu
Application(„menuItems“) = objRootLinks.childNodes.length
‚podobnym zpusobem ziskame i zakladni informace
Application(„autor“) = objRootBasics.childNodes.item(0)
Application(„page_title“) = objRootBasics.childNodes.item(1)
Application(„header_image“) = objRootBasics.childNodes.item(2)
End sub

A nyní nasbírané informace pošlete prohlížeči:

<HTML>
<HEAD>
 <TITLE><%=application(„page_title“)%></TITLE>
</HEAD>
<BODY>
<!– vlozime logo –>
<img src=“<%=application(„header_image“)%>“>
<br>
<!–vypiseme menu–>
<%
 For i = 0 to application(„menuItems“)
  response.write(„<a href=“““ & application(„menuUrl“ & i) & „““>“ & application(„menuText“ & i) & „</a><br>“)
 Next
%>
<br><br><br>
<!–napiseme zapati stranky–>
<hr>
<span>© 2003 <%=application(„autor“)%></span>
</BODY>
</HTML>

Myslím si, že tato miniaplikace dobře demonstruje princip a smysl XML-brain. Osobně tuto techniku využívám v maximální možné míře, nejednou mi zachránila vlasy na hlavě! Vezměte si třeba adresu loga stránky – pokud by se změnila, museli byste změnit cestu na všech stránkách. Takto stačí pouze jediný zásah do settings.xml.

Musím vás ale upozornit na možné komplikace. Uvažujme, že bychom měli nějakou stránku uloženou v podsložce webu. V settings.xml by zápis vypadal zhruba takto: <link url="downloads/downloads.asp">Downloads</link>. Na tom není nic divného, ale do aplikační proměnné application("menuUrl") uložíme samozřejmě plnou cestu i se složkou. Pokud bychom tedy na stránce downloads.asp vypsali menu, v adrese by bylo opět downloads/downloads.asp, přestože se již ve složce downloads nacházíme. Po dalším kliknutí na odkaz by se prohlížeč snažil dostat na adresu downloads/downloads/downloads.asp, což nechceme.

Jak asi tušíte, je celé téma daleko obsáhlejší, nicméně jsem se vám alespoň pokusil přiblížit, jak ASP pracuje se strukturou dokumentu XML a jak do svých stránek dostat informace uložené v XML.

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