XML staat centraal in het .NET Framework. Daar ziet u niet zoveel van, maar in feite wordt het onder water veel gebruikt. U kunt er zelf ook op verschillende manieren gebruik van maken, maar dan moet u natuurlijk wel weten wat XML nu eigenlijk is, waar het voor dient, en hoe u het gebruikt.
XML staat voor Extensible Markup Language, vrij vertaald "uitbreidbare opschrijf (of opmaak) taal". XML is bedoeld als universele (standaard) taal voor het beschrijven van gegevens en hun betekenis. Deze beschrijving kan vervolgens gebruikt worden om de gegevens op te slaan of te versturen. De manier waarop gegevens in XML beschreven worden staan toe dat u allerlei verschillende gegevensstructuren kunt beschrijven. Zo kunt u makkelijk tabellen met gegevens (zoals in een database of een Excel bestand) beschrijven, maar is het even goed mogelijk om gegevens te beschrijven die een hiδrarchische of ad hoc structuur beschrijven. Doordat XML zo flexibel is kan het voor allerlei doeleinden gebruikt worden, en het ziet er dan ook naar uit dat de meeste softwaremakers XML adopteren als hΘt medium voor het opslaan en versturen van gegevens.
XML is in feite tekst waarin speciale markeringen gebruikt worden om gegevens en hun betekenis te beschrijven. Omdat iedere computer met tekst overweg kan, kan iedere computer met XML werken, waardoor het uitermate geschikt is om gegevens uit te wisselen tussen verschillende computers, mogelijk met verschillende operating systemen (Windows, Unix/Linux, Macintosh, enz.). U kunt XML in die zin vergelijken met HTML dat door iedere webbrowser op iedere soort computer gelezen kan worden. HTML en XML lijken ook erg op elkaar, hetgeen niet verwonderlijk is als u bedenkt dat ze afgeleid zijn van dezelfde taal. XML en HTML zijn afgeleid van Standard Generalized Markup Language (SGML) dat al in 1969 uitgevonden werd door IBM Research. SGML is echter een complexe taal en daardoor niet erg geschikt bevonden voor de massa. In tegenstelling tot SGML is HTML erg makkelijk, maar ook beperkt tot het beschrijven van opmaak voor een document. HTML is daardoor niet geschikt om gegevens mee te beschrijven, want wat is de betekenis van een vet of cursief woord? Toen XML werd ontworpen halverwege de jaren 90, was het doel om het zo generiek te maken als SGML, maar zo makkelijk als HTML.
Gegevens die met XML worden beschreven, staan in een document. Een document kan een bestand zijn (zoals een Word document een bestand is), maar dit is niet noodzakelijk. Het document kan alleen maar dienen als pakketje met gegevens voor een andere computer, en dan is het niet nodig om het als een bestand op te slaan. Ook kan het zo zijn dan een document gegenereerd wordt op basis van gegevens uit een database of een andere gegevensbron.
Een XML document bestaat uit elementen. Ieder element representeert een waarde met een betekenis, zoals te zien in de voorbeelden hieronder.
<meubel>tafel</meubel>
<rekenen>tafel</rekenen>
<telefoonnummer>020-1234567</telefoonnummer>
<getal>1234567</getal>
Zoals u in de voorbeelden hierboven ziet, begint een element altijd met de markering <elementnaam> en eindigt met de markering </elementnaam>. De / in de tweede markering geeft aan dat het om een eindmarkering gaat. Een eventuele waarde wordt tussen de begin- en eindmarkering gegeven, maar de waarde mag ook leeg zijn. De elementnaam geeft de betekenis van de waarde aan. De elementnaam mag in principe alles zijn dat (volgens de maker) voldoende weergeeft wat de betekenis van de waarde is. De elementnaam moet een zogenaamde Qualified Name (QName) zijn. Een QName begint met een letter of een _ teken (underscore), en mag dus niet beginnen met een cijfer, - teken (hyphen), of andere exotische karakters. Na het eerste karakter mag u wel een hyphen gebruiken, maar de meeste andere karakters niet zijn geoorloofd. Speciale karakters zijn over het algemeen alleen maar verwarrend, dus het is een goed idee om die nooit te gebruiken in een elementnaam. Een belangrijk "karakter" dat niet geoorloofd is in een elementnaam is een spatie. Andere wit-karakters, zoals tab en nieuwe regel zijn ook niet geoorloofd.
Elementnamen (en markeringen) die verschillend geschreven zijn, bijvoorbeeld door verschillend hoofd- en kleine letters te gebruiken zijn niet hetzelfde (in tegenstelling tot HTML), het volgende voorbeeld is dus incorrect:
<telefoonnummer>020-1234567</TelefoonNummer>
Omdat in het bovenstaande voorbeeld de eindmarkering twee hoofdletters bevat, is de eindmarkering ongelijk aan de beginmarkering. De XML hierboven is daardoor niet juist geformeerd. We zeggen ook wel dat de XML niet well-formed is. XML is well-formed als de syntax geen fouten bevat. Een andere vereiste voor XML om well-formed te zijn is dat een element een begin- Θn eindmarkering heeft. Elementen zonder eindmarkering, zoals bijvoorbeeld de elementen <hr>, <br> en <input> die in HTML gebruikelijk zijn, zijn in XML onjuist. Een XML element moet er dus op z'n minst als volgt uit zien:
<leeg></leeg>
Het element hierboven is leeg, en heeft dus geen waarde (maar mogelijk wel een betekenis). Een alternatief hiervoor is een markering die tegelijk de begin- en eindmarkering is. Zo'n markering moet eindigen met een /, dus <leeg/> of <leeg />. De spatie is optioneel, en is niet van invloed op de betekenis van het element. Het laatste voorbeeld wordt vooral gebruikt bij HTML die als XML ingelezen moet kunnen worden (ook wel XHTML genoemd). Veel oudere webbrowsers zien de / aan het einde als een fout. Diezelfde webbrowsers maken er geen probleem van als er eerst een spatie volgt.
Naast het kunnen maken van elementen is de structuur van een XML document erg belangrijk. Een XML document heeft een boomstructuur, vergelijkbaar met de mappen op een harde schijf. Het document mag maar ΘΘn wortel element hebben. Alle andere elementen moeten direct of indirect daaronder vallen. De waarde van het wortel element is in feite alle elementen die daaronder vallen. Het voorbeeld hieronder verduidelijkt dit.
<contactpersonen> <persoon> <voornaam>Michiel</voornaam> <tussenvoegsel>van</tussenvoegsel> <achternaam>Otegem</achternaam> </persoon> <persoon> <voornaam>Tim</voornaam> <achternaam>Berners-Lee</achternaam> </persoon> </contactpersonen>
In het voorbeeld hierboven is het element contactpersonen de wortel van het XML document. De wortel bevat meerdere elementen, net zoals een harde schijf meerdere mappen kan bevatten. In dit geval zijn de elementen in het contactpersonen element hetzelfde, maar zoals u kunt zien aan de persoon elementen is dit niet verplicht. Iedere combinatie van elementen is in principe mogelijk en elementen kunnen eventueel herhaald worden, dat is wat XML zo flexibel maakt. Elementen mogen echter niet door elkaar heen beginnen en eindigen, het volgende is dus onjuist:
<b><i>Cursieve en Vette tekst</b></i>
Nu u weet wat XML is, dat XML uit elementen bestaat, en dat een XML document een hiδrarchische structuur van XML elementen is, kunnen we wat dieper ingaan op wat een element is en wat voor waardes een element kan hebben. Hierboven heeft u kennis gemaakt met de lege waarde (of geen waarde), en de tekst waarde. Impliciet heeft u ook nog met een derde waarde kennis gemaakt, namelijk een waarde die bestaat uit andere elementen. In feite mag een element vier verschillende waardes hebben:
Wat hier duidelijk mist zijn getalwaarden. Dat komt omdat in XML eigenlijk alles tekst is, en programma's geen onderscheid kunnen maken tussen tekst en getallen zonder de betekenis te weten van een waarde, aangezien cijfers zelf ook tekst zijn. Praktisch gezien is er natuurlijk wel een onderscheid, maar daar komen we later pas op terug als we XML daadwerkelijk gaan gebruiken in programma's.
Een element met als waarde een mix van elementen en tekst heeft u tot nog toe niet gezien. Voor gestructureerde gegevens, zoals gegevens in een tabel van een database zijn zulke waardes ook niet nodig, en zelfs onwenselijk. Toch zijn zulke waardes erg handig. Denk maar eens aan HTML, waarin een <p> element zowel tekst als elementen kan bevatten die opmaak geven aan bepaalde woorden, zoals hieronder.
<p> Dit is een <b>element</b> waarin <i>tekst</i> en <i>elementen</i> met elkaar afgewisseld worden. </p>
Het voorbeeld hierboven is well-formed en dus kunnen we het zien als XML. Doordat er alleen opmaakinformatie in staat zoals in HTML is het maar beperkt bruikbaar. We zouden ook elementen kunnen gebruiken die meer betekenis geven aan de woorden die nu vet of cursief staan, zoals hieronder.
<tekst> Dit is een <definitie>element</definitie> waarin <waarde>tekst</waarde> en <waarde>elementen</waarde> met elkaar afgewisseld worden. </tekst>
Doordat we aan specifieke woorden meer betekenis hebben gegeven, is het mogelijk om op basis van die betekenis elementen te selecteren. Dit kan bij het HTML fragment ook, maar daar weten we niets over de betekenis. Er kunnen elementen zijn die dezelfde opmaak krijgen in de weergave, maar die een andere betekenis hebben. Die kunnen we met HTML dus niet van elkaar onderscheiden, terwijl dat met XML wel kan. Een webbrowser kent de betekenis van HTML wel, maar deze is beperkt tot opmaak. HTML heeft dan ook een (min of meer) vaste vocabulaire, zodat webbrowsers de elementen kunnen herkennen. Elementen die buiten de vocabulaire van een webbrowser vallen, worden genegeerd. XML heeft geen vaste vocabulaire. U kunt de vocabulaire zelf vaststellen. Vervolgens kunt u een applicatie maken die deze vocabulaire kent, en dus weet wat er moet gebeuren als een bepaald element voorkomt in een XML document. Dit maakt eens te meer duidelijk dat XML op zichzelf niet bedoeld is voor weergave. Om een XML document weer te geven heeft u een programma nodig dat de vocabulaire van het document kent.
In sommige gevallen is het handig om extra informatie over een element te kunnen geven. Dit kan door middel van attributen. Attributen zijn zogenaamde naam-waarde paren (name-value pairs). Dit betekent dat een element slechts ΘΘn attribuut mag bevatten met dezelfde naam, terwijl een element meerdere elementen mag bevatten met dezelfde naam. De waarde van een attribuut is ook altijd tekst. Een attribuut voegt u toe in de beginmarkering van een element, of als onderdeel van een leeg element, als volgt:
<persoon voornaam="Michiel" tussenvoegsel="van" achternaam="Otegem"/>
Het voorbeeld hierboven is een leeg persoon element met drie attributen. Van ieder attribuut wordt eerst de naam gegeven, gevolgd door een =-teken en een tekst waarde tussen aanhalingsteken. De naam van een attribuut is gebonden aan dezelfde restricties als een elementnaam. Verder moet het =-teken direct achter de attribuutnaam staan, en moet de waarde tussen aanhalingstekens gezet worden. Een waarde mag eventueel ook tussen apostrofs gezet worden als u een waarde met aanhalingstekens hebt, dus bijvoorbeeld 'Hij zei: "ik ga weg".'. Andersom is natuurlijk ook mogelijk, dus bijvoorbeeld "gaat 't?". Wat u moet doen als u beide karakters in een waarde wilt gebruiken komt later ter sprake.
Het is u misschien opgevallen dat het voorbeeld element hierboven dezelfde gegevens bevat als het persoon element dat eerder gebruikt werd. Het verschil is dat de gegevens hier in attributen staan, terwijl eerder de gegevens in elementen stonden. Het is ook zo dat ieder attribuut tot element gemaakt kan worden. Er zijn daarom ook mensen die vinden dat u nooit attributen moet gebruiken, omdat een attribuut in feite een speciaal soort element is, namelijk een die slechts ΘΘn keer mag voorkomen in een element en alleen een tekstwaarde mag bevatten. Het is dus ook zeker niet zo dat alle elementen tot attribuut gemaakt kunnen worden, want elementen die vaker voorkomen of geen tekstwaarde hebben, kunnen niet tot attribuut gemaakt worden. Het voordeel van attributen is dat ze minder ruimte in nemen. Als opslagruimte of bandbreedte beperkt is, kun u met attributen de grootte van een document verminderen. Ook weet u zeker dat een waarde slechts ΘΘn keer kan voorkomen. Dit kan natuurlijk ook een nadeel zijn, want een persoon zou bijvoorbeeld meerdere voornamen, tussenvoegsels, en /of achternamen hebben. Met het persoon element hierboven kom u dan in de problemen.
Hierboven heeft u geleerd over XML als tekst. Een programma dat XML inleest en gebruikt, kan het dan ook als tekst inlezen en vervolgens ontleden of parsen. Dit levert dan de waardes van de elementen en attributen op. Een XML document is echter meer dan een verzameling waardes alleen. De waardes hebben vaak een onderlinge relatie. Deze relatie is vastgelegd in de structuur van het document. De structuur van een XML document is altijd een boomstructuur. Hierin is ΘΘn element het hoofdelement waaronder nul of meer elementen kunnen vallen, net zoals een boom ΘΘn stam heeft, maar meerdere takken. Het XML document hieronder laat dit zien. Figuur 1 laat nog eens de bijbehorende structuur zien.
<A>
<B>
<D>1</D>
<D>2</D>
</B>
<C> <E X="3"/>
<E X="4"/>
</C>
<B/>
</A>
Figuur 1, Boomstructuur van een XML document
In figuur 1 zijn elementen (eventueel met waarde) weergegeven als cirkels en attributen met hun waarde als vierkanten. De illustratie maakt de relatie tussen de elementen, attributen, en waardes duidelijker. Zo kunt u dus bijvoorbeeld zeggen dat A het parent (ouder) element van C is. A is tevens het hoofdelement of root element, en A heeft drie child (kind) elementen. Deze boomstructuur laat dus de relatie tussen de elementen en attributen zien. Binnen een dergelijke boomstructuur valt het onderscheid tussen elementen en attributen weg. Het is dat attributen met een ander symbool worden weergegeven, maar aan de structuur zelf zie u dat het net zo goed elementen hadden kunnen zijn. Omdat het onderscheid tussen een element en een attribuut zo klein is, wordt ook wel gesproken over een node. De boomstructuur van een XML document (of een fragment daarvan) wordt ook wel een node-tree genoemd. Verder spreken we over een verzameling nodes (eventueel uit verschillende delen van het oorspronkelijke document) als een node-set.
In het voorbeeld hierboven is de waarde van de D elementen gemakshalve als onderdeel van het element weergegeven. In de meeste gevallen wordt de tekst waarde van een element echter als een losse node gezien, een zogenaamde text-node. Een text-node bevat alleen tekst en kan verder geen attributen of iets dergelijks hebben. Het onderscheid tussen een tekstwaarde van een element en een text-node is voornamelijk relevant als een element zowel tekst als elementen bevat, zoals in het voorbeeld hieronder.
<tekst>Dit is een <definitie>element</definitie> waarin <waarde>tekst</waarde> en <waarde>elementen</waarde> met elkaar afgewisseld worden.</tekst>
Het zou erg lastig zijn als de waarde van het tekst element alle tekst zou zijn met uitzondering van de tekst die onderdeel uitmaakt van de onderliggende elementen. De text-node geeft hier de uitkomst, want door de tekst die direct in het tekst element staat als aparte node te beschouwen, is er weer gewoon sprake van een boomstructuur, zoals te zien in figuur 2.
Figuur 2, XML boomstructuur met tekst nodes
⌐2002 Microsoft Nederland BV