HTML-Hajen

Lister fra XML-databaser ud fra faste keywords









Faste udtræk fra XML-filer

En af de gode ting ved at arbejde med databaser er, at man indtaster data én gang, og så kan man trække data ud som man lyster. En af de udtrækninger man kan have glæde af, er faste udtrækninger af en del af databasen. Det kunne f.eks. være tabeller med alle de danske eller tyske virksomheder på en liste over underleverandører, eller alle laptops på en inventarliste. Ved at vælge sin struktur i XML-databasen med lidt omtanke, kan dette være et uhyre stærkt værktøj til hjemmesiden.

Med XML-databaser er dette en yderst simpel opgave.


XML-filen

XML-filen består af et felt man søger i, og et felt man returnerer. Det kan sagtens være det samme felt, men pga. den måde som vi formulerer os på med negation og brug af synonymer, er det ofte mere hensigtsmæssigt at søge i ét felt og returnere indholdet fra et andet felt. Hvis vi prøver at lave en liste med vittigheder som model, så kunne listen se således ud:

<?xml version="1.0" encoding="UTF-8"?>
<Jokes>

<Joke>
<Type>Aarhusianere</Type>
<Text><![CDATA[- Hvorfor står aarhusianerne op i sengen, når de skal sove?<BR>
- Fordi de har hørt, at de skal falde i søvn!]]></Text>
</Joke>

<Joke>
<Type>Pærer</Type>
<Text><![CDATA[- Hvor mange politikere kræver det at skifte en pære?<BR>
- Ingen, man ignorerer problemet og håber det løser sig selv!]]></Text>
</Joke>

<Joke>
<Type>Aarhusianere</Type>
<Text><![CDATA[- Hvad står der i de aarhusianske rundkørsler?<BR>
- Maks. 3 omgange!]]></Text>
</Joke>

<Joke>
<Type>Ordspil</Type>
<Text><![CDATA[- Hvordan kan det være, at en gråspurv hurtigere kan spise en sæk havre end en hest?<BR>
- Fordi gråspurve ikke spiser heste!]]></Text>
</Joke>

<Joke>
<Type>Aarhusianere</Type>
<Text><![CDATA[- Hvorfor stikker aarhusianske kvinder p-piller i næsen?<BR>
- For ikke at få snotunger!]]></Text>
</Joke>

</Jokes>

Listen får navnet Jokes.xml, og ligger her i samme directory som HTML-filen med JavaScriptet der trækker listen.


JavaScriptet

Når man skal lave en simpel liste som denne, er det lettest og hurtigst at arbejde med et internt script med document.write(). Vil man gerne gøre noget andet, af den ene eller den anden grund, er man selvfølgelig meget velkommen til dette.

JavaScriptet består af tre dele:
  1. Indlæsning af XML-filen
  2. Gennemløb af XML-filens Type-felt
  3. Hvis Type-feltet indeholder søgekriteriet, skrives indholdet fra Joke-feltet og der tilføjes en spacer.

I dette eksempel vil vi trække aarhusianervittighederne og spaceren er to breaks, en vandret linje og et break, dvs. <BR><BR><HR><BR>.


Det første vi skal have fat i er XML-filen. Til dette anvender vi JavaScriptet loadXMLDoc(). Hvordan det er lavet, kan læses her. Så langt ser JavaScriptet nu således ud:

<SCRIPT TYPE="text/javascript">
xmlDoc=loadXMLDoc("Jokes.xml");

</SCRIPT>

Dernæst skal vi have fat i værdierne for de to tags Type og Text. Dette gør vi med getElementsByTagName():

<SCRIPT TYPE="text/javascript">
xmlDoc=loadXMLDoc("Jokes.xml");

var Type_lmnt = xmlDoc.getElementsByTagName("Type");
var Joke_lmnt = xmlDoc.getElementsByTagName("Text");

</SCRIPT>

Vi har nu fat i de to tags, og vi gør nu det, at vi traverserer Type_lmnt til vi finder feltværdien Aarhusianere. Det ser således ud:

<SCRIPT TYPE="text/javascript">
xmlDoc=loadXMLDoc("Jokes.xml");

var Type_lmnt = xmlDoc.getElementsByTagName("Type");
var Joke_lmnt = xmlDoc.getElementsByTagName("Text");

for (i = 0; i < Type_lmnt.length; i++)
if (Type_lmnt[i].firstChild.nodeValue == "Aarhusianere") { }

</SCRIPT>

Når rutinen så under traverseringen finder feltværdien Aarhusianere, skal vi have den til at skrive indholdet af Text-tag'en, dvs. Joke_lmnt, efterfulgt af <BR><HR><BR>. Så kommer det til at se således ud:

<SCRIPT TYPE="text/javascript">
xmlDoc=loadXMLDoc("Jokes.xml");

var Type_lmnt = xmlDoc.getElementsByTagName("Type");
var Joke_lmnt = xmlDoc.getElementsByTagName("Text");

for (i = 0; i < Type_lmnt.length; i++)
if (Type_lmnt[i].firstChild.nodeValue == "Aarhusianere") {
document.write(Joke_lmnt[i].firstChild.nodeValue + "<BR><BR><HR><BR>");}

</SCRIPT>


På skærmen kommer det til at se således ud:



if-konstruktionen kan selvsagt udvides med AND, OR, ELSE osv. efter behov, og vil man have f.eks. en tabel, kan man gøre dette, som vist under de simple lister her.