R2D2 > Waarom XML 2 RDB > XML > DTD
XML heeft zijn eigen schema, namelijk de Document Type Description (DTD). DTD's beschrijven welke tags gebruikt mogen worden en hoe ze genest moeten worden. Daarnaast leggen DTD's ook de volgorde vast waarin elementen moeten staan en hoeveel er mogen voorkomen. Een DTD kan gebruikt worden voor meerdere XML-documenten.
In een DTD zijn een aantal onderdelen te onderscheiden.
<!DOCTYPE naam []> - met deze declaratie wordt aangegeven wat het zogenaamde topelement is in het XML-document. Dit topelement mag slechts één keer voorkomen in een XML-document, vergelijkbaar met de <html> tag in een HTML-document. Om een DTD in een XML-document aan te roepen zijn er twee mogelijkheden. Allereerst kan de DTD in het XML-document zelf gedefinieerd worden. In dat geval staan tussen de vierkante haken ([]) de declaraties van de elementen. De tweede manier is dat de declaraties in een los bestand worden opgeslagen. In dat geval wordt in de DOCTYPE aangegeven waar dat bestand zich bevindt (<!DOCTYPE naam SYSTEM "bestand.dtd">).<!ELEMENT elNaam ()> - met deze declaratie worden de verschillende elementen gedefinieerd die voor mogen komen in een XML-document. Hier staat elNaam voor de naam van het element. In een XML-document wordt dit dus weergegeven door <elNaam>waarde</elNaam>. Tussen de haakjes komen de elementen die genest kunnen voorkomen onder dit element. Een voorbeeld is <!element persoon (naam,leeftijd,email*)>. Hier staat dat onder het element persoon een element naam, leeftijd en nul of meer elementen email mogen voorkomen (in die volgorde). De ster operator (*) betekent hier "nul of meer keer". Er zijn een aantal van deze operatoren. Naast el* zijn er ook nog el+ (één of meer keer voorkomen), el? (nul of één keer voorkomen), el|el2 (alternatieven: of el, of el2) en el, el2 (achterelkaar voorkomen: eerst el, dan el2). Het is ook mogelijk dat tussen een bepaald element alleen een string komt te staan. In dit geval komt er #PCDATA te staan op de plaats van de ronde haakjes (<!ELEMENT naam #PCDATA>). Natuurlijk is een combinatie van elementen en #PCDATA ook mogelijk.<!ATTLIST elNaam attNaam type #status> - op deze wijze worden attributen gedeclareerd. elNaam is de naam van het element waar het attribuut aan toegewezen wordt. attNaam is vervolgens de naam van het attribuut. Het type informatie dat hierin neergezet mag worden, wordt gedefinieerd door type. De belangrijkste mogelijkheden zijn de volgende:
CDATA - zogenaamde character data, oftewel een willekeurige string.(fruit | groente | aardappelen).ENTITY - hier mag een entity worden ingevuld die elders in de DTD gedefinieerd is.ID - dit geeft de mogelijkheid om een element een ID mee te geven. Deze ID moet uniek zijn voor het hele XML-document.IDREF - met dit type kan een verwijzing naar een ID aangegeven worden. Er wordt verwezen naar een element elders in het XML-document dat een attribuut van het type ID heeft.ATTLIST kunnen meerdere attributen per element gedefinieerd worden. Voor elk attribuut is ook aan te geven of deze verplicht zijn of niet. Daarvoor zijn voor #status een aantal waarden in te vullen, namelijk #REQUIRED als het attribuut verplicht een waarde moet hebben, #IMPLIED als het attribuut niet persé een waarde hoeft te hebben en #FIXED als het attribuut een vaste waarde heeft (dit wordt dan als laatste argument meegegeven aan de declaratie). Een voorbeeld:
<!ATTLIST person sekse (man | vrouw) #REQUIRED
opmerkingen CDATA #IMPLIED
id ID #REQUIRED
familie IDREF #IMPLIED
type CDATA #FIXED "mens">
<!ENTITY %naam "vervanging"> - deze declaraties kunnen gebruikt worden om bepaalde (groepen) karakters te vervangen door anderen. Er zijn vier soorten (waarvan de eerste twee de belangrijkste zijn):
< en > of 'vreemde' karakters. Deze worden op de volgende manier gedefinieerd: <!ENTITY copyright "©">. In een XML-document wordt dit aangeroepen met ©right; en dit tovert het copyright teken (©) op het scherm.<!ENTITY %txt "(#PCDATA)">. Later kan bij een element declaratie dan deze korte variant gebruikt worden: <!ELEMENT naam %txt;>.<!ENTITY adressen SYSTEM "adressen.xml">. In een XML-document kan dit bestand in één keer geïmporteerd worden door te verwijzen naar &adressen;.DTD's hebben ook een aantal tekortkomingen. Deze worden genoemd in [ABI00]:
<lengte>), dan zijn er twee mogelijkheden: er moeten twee tags gedefinieerd worden (een tag <persoonslengte> en een tag <filmlengte>), of er moet gewerkt worden met namespaces. Er worden twee namespaces aangemaakt (een persoon namespace en een film namespace) en vervolgens twee tags persoon:lengte en film:lengte. Voor elke namespace moet er dan wel een aparte DTD komen.In een DTD kunnen een aantal operatoren voorkomen aan te geven hoe vaak en in welke volgorde elementen voor kunnen komen. Hieronder staan ze opgesomd en uitgelegd:
? operator - de operator betekent dat het element 0 of 1 keer voor mag komen* operator - het element mag 0 of meer keer voorkomen+ operator - deze operator betekent dat het element minimaal 1 keer moet voorkomen., operator - met deze operator wordt de volgorde bepaalt. Elk element moet precies in deze volgorde voorkomen| operator - ook deze operator regelt de volgorde. Hierbij gaat het om keuze. Het ene of het andere element mag voorkomenNu XML uitgebreid besproken is, is het tijd om een blik te werpen op relationele databases.
| << vorige | volgende >> | ©Robert Bouma, 02-01-2003 |