Hvordan stukturerer man XML-databaser?





Den indledende besværgelse i XML-filer

På samme måde som man i HTML skulle deklarere en dokumenttype, skal man også deklarere en dokumenttype til XML. Den ser således ud:

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

Bemærk at alt er skrevet med lower case. XML er case sensitive og kan lide lower case. På samme måde som man i HTML deklarerede en tegntabel med charset, skal der også i XML deklareres en tegntabel. Her hedder det blot "encoding". Man kan selvsagt vælge en anden kode end UTF-8, hvis man skulle ønske dette, og man skal, ligesom i HTML, huske at der skal være overensstemmelse mellem tegntabellen og filformatet.

Herefter er det lige på med at definere sine tags.


XML-tags

Modsat HTML, er der ingen foruddefinerede tags til XML, dem definerer man selv. Erfaringsmæssigt, er det smart at navngive sine tags efter indhold. Når man begynder at skulle have fat i data med JavaScript, er det lettere at hitte rede i felterne når de har et beskrivende navn. XML-tags har en start og en slut, ligesom HTML f.eks.

<Boeger>
</Boeger>

Med deklarationen af filtype og tegntabel kommer det så til at se således ud:

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

<Boeger>
</Boeger>

Ligesom filnavne kan man ret beset godt anvende specielle karakterer som æ, ø og å til navngivning af tags, men det er generelt en skidt idé. Browsere og JavaScript er ikke altid så gode til at håndtere specielle karakterer, som deres programmører mener. Husk også, at XML-tags er case-sensitive, så <Boeger> og <boeger> behandles som to forskellige tags.

Den første tag man laver, er den der definerer databasens navn, ikke at forveksle med filnavnet. Det er en af de sære ting ved XML, som man bare må leve med.

Lige nu har vi bare en skal til databasen. Vi prøver nu at gøre databasen anvendelig. Til det skal vi bruge nogle felter der kan udfyldes.

En tag svarer i virkeligheden til et felt i et regneark. Hvis vi bliver ved vore bøger, så skal vi f.eks. bruge et titelfelt og et forfatterfelt til hver bog. Dette bygges op med en tag vi kalder Bog, som bliver posteringen, og de to tags Titel og Forfatter, som er felterne med informationer om hver bog/postering. Det ser således ud:

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

<Boeger>

<Bog>
<Titel></Titel>
<Forfatter></Forfatter>
</Bog>

</Boeger>

Når man så skal have flere bøger indtastet, så laver man blot posteringer, f.eks. sådan her med to sæt:

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

<Boeger>

<Bog>
<Titel>Bogtitel 1</Titel>
<Forfatter>Forfatter 1</Forfatter>
</Bog>

<Bog>
<Titel>Bogtitel 2</Titel>
<Forfatter>Forfatter 2</Forfatter>
</Bog>

</Boeger>

Man behøver ikke et mellemrum mellem linjerne som jeg har lavet det. Det er fuldt gangbart på denne måde:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Boeger>
<Bog>
<Titel>Bogtitel 1</Titel>
<Forfatter>Forfatter 1</Forfatter>
</Bog>
<Bog>
<Titel>Bogtitel 2</Titel>
<Forfatter>Forfatter 2</Forfatter>
</Bog>
</Boeger>

Det er bare noget frygteligt uoverskueligt tekst, så snart man kommer op på nogle få entries i sin database, så jeg anbefaler generelt at man lige laver nogle afstandslinjer, så det er til at finde rundt i sin kode.


Underinddelinger i XML-tags (multivalue-felter)

Som XML-databasen er struktureret i det foregående afsnit, ligner det en standard database som vi kender fra f.eks. Access eller OpenOffice Database, eller for den sags skyld et regneark. MEN man kunne få brug for underinddelinger, f.eks. hvis der var flere forfattere på nogle af bøgerne, eller man ville dele navnene op i fornavn og efternavn. Det gør man ved at sætte en felt-tag ind i en anden felt-tag. Hvis vi starter med at ville have flere forfatternavne, vi kalder tag'en for Forfatternavn, så ser det således ud:

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

<Boeger>

<Bog>
<Titel>Bogtitel 1</Titel>
<Forfatter>
<Forfatternavn>Forfatter 1</Forfatternavn>
<Forfatternavn>Forfatter 2</Forfatternavn>
</Forfatter>
</Bog>

<Bog>
<Titel>Bogtitel 2</Titel>
<Forfatter>
<Forfatternavn>Forfatter 3</Forfatternavn>
</Forfatter>
</Bog>

</Boeger>

Når man har underinddelinger er Forfatter det der hedder parent-tag og Forfatternavn er child-tag. Hvis der er flere child-tags til en parent, kaldes disse for siblings.

Som det ses, behøver der ikke være det samme antal underinddelinger i de forskellige tags, og når man laver denne opbygning, der også hedder multi value-felter, er det netop fordi der typisk er et varierende antal underinddelinger.

Hvis vi i stedet vil have, at forfatternavnet er delt op i for- og efternavne, så ser det således ud:

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

<Boeger>

<Bog>
<Titel>Bogtitel 1</Titel>
<Forfatter>
<Fornavn>Fornavn 1</Fornavn>
<Efternavn>Efternavn 1</Efternavn>
</Forfatter>
</Bog>

<Bog>
<Titel>Bogtitel 2</Titel>
<Forfatter>
<Fornavn>Fornavn 2</Fornavn>
<Efternavn>Efternavn 2</Efternavn>
</Forfatter>
</Bog>

</Boeger>

De to metoder kan selvsagt kombineres efter behov. Man designer selv sin database efter typen af indhold der skal struktureres.


Hvis man skal bruge HTML-koder i XML-tags

XML-tags kan som udgangpunkt kun håndtere plain text, dvs. tekst uden noget der ligner koder eller dele af koder. Dette inkluderer tegn som f.eks. < og >. Hvis man i sin tag skal have f.eks. HTML-tags er man nødt til at bruge det der hedder CDATA. Det svarer til en ekstra tag, som man forer sin tag med. Start hedder <![CDATA[ og slut hedder ]]>. Hvis vi tager tag'en "Titel" fra før, ser den nu således ud:

<Titel><![CDATA[
]]></Titel>

Bemærk! CDATA skal være i den tag man skriver teksten. Hvis man har underinddelinger i sine tags, skal man IKKE have CDATA på parent tag, men child-tag'en, for ellers kan de JavaScript man anvender til at læse i databasen ikke finde ud af at behandle child-tags'ene som separate felter.