Introductie tot XML
Door Michiel van Otegem
24 februari 2007
XML is een van de belangrijkste technologieën van de laatste jaren. Bijna alle
nieuwe software die op de markt komt gebruikt XML. Toch is XML voor de meeste
mensen iets ontastbaars. Wat is het en wat maakt het zo bijzonder?
XML, voluit Extensible Markup Language, is een manier om gegevens te beschrijven.
XML is op zichzelf is heel eenvoudig en kan opgeslagen worden als tekst. Daar
staat tegenover dat je aan XML alleen ook niet veel hebt. XML is namelijk in
feite niet meer dan de grammatica van een taal. XML zelf omvat geen woorden, en
om een taal te vormen heb je grammatica én woorden nodig. XML wordt daarom ook
wel een meta-taal genoemd, omdat je er talen mee kunt "maken". Een dergelijk taal
noemen we een XML formaat, en omdat alle formaten aan dezelfde grammatica voldoen,
kun je ze op dezelfde manier behandelen. Je kunt dezelfde software dus gebruiken
voor verschillende formaten. Zo kun je een XML editor gebruiken voor bijvoorbeeld
CML (Chemical Markup Language) en SVG (Scalable Vector Graphics). Deze XML formaten,
die je ziet in afbeelding 1 en 2, voor respectievelijk de chemie en het maken van
vector afbeeldingen. Omdat ze allebei aan de regels van XML voldoen, weten we hoe
we ze moeten lezen. Dat neemt overigens niet weg dat beide formaten beter te
bewerken zijn met een specifieke CML of SVG editor, omdat daarmee specifiek
aandacht besteed wordt aan het vocabulaire en doel van het betreffende formaat.
Sterker nog, die editors zouden een weergave kunnen gebruiken die in niets doet
denken aan XML. Er zijn bijvoorbeeld verschillende tekenprogramma’s die afbeeldingen
kunnen opslaan als SVG. Het bewerken van SVG bestanden is net als ieder andere
vectorafbeelding. Alleen bij het inlezen en opslaan maakt het uit dat de afbeelding
is opgeslagen als SVG. Voor het inlezen en opslaan kunnen programma's die SVG
ondersteunen wel een standaard XML "parser" kunnen gebruiken. Een XML parser is
voor alle XML formaten identiek, omdat de parser alleen naar de grammatica kijkt,
niet naar het vocabulaire en de daaraan verbonden betekenis. Daarom kan dezelfde
parser ook gebruikt worden door bijvoorbeeld een CML editor.
1: <molecule convention="MDLMol" id="mols2" type="2D">
2: <date day="27" month="06" year="1998">
3: </date>
4: <atomArray>
5: <atom id="a1">
6: <string builtin="elementType">H</string>
7: <float builtin="x2">8.7542</float>
8: <float builtin="y2">-2.2417</float>
9: </atom>
10: </atomArray>
11: </molecule>
Afbeelding 1, Voorbeeld van Chemical Markup Language
1: <?xml version="1.0" standalone="no"?>
2: <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
Afbeelding 2, Voorbeeld van Scalable Vector Graphics
De XML grammatica
Als we het over XML hebben, praten we over XML documenten. Een document kan een
daadwerkelijk bestand zijn, maar het kan bijvoorbeeld ook onderdeel uitmaken van
communicatie tussen twee systemen, zodat er geen fysiek bestand is. Een XML
document bevat een of meerdere elementen . Als er meerdere elementen zijn, dan
staan deze in een hiërarchische boomstructuur, net als de mappen op een harde
schijf. Net als de harde schijf heeft de boomstructuur slechts één "wortel", het
root element. De vraag die nu nog rest is "wat is een element?". Zoals gezegd is
XML tekst, en een element is dan ook niets anders dan een markering. Deze
markering wordt gemaakt aan de hand van zogenaamde tags, die we ook wel uit HTML
kennen (maar met enkele subtiele verschillen). Een element ziet er als volgt uit:
<element></element>
Het eerste gedeelte is de begin-tag, en het gedeelte met de / de eind-tag. Tussen
de begin- en de eind-tag kunnen andere elementen en/of tekst geplaatst worden.
Doe je dit niet, dan mag je het voorbeeld hierboven ook schrijven als <element/>,
waarbij de eind-tag onderdeel uitmaakt van de begin-tag. De tekst die tussen de
begin- en eind-tag van een element staat is de waarde van dat element. Als er
elementen tussen de begin- en eind-tag staan, dan zijn dat sub-elementen. Hierdoor
ontstaat de hiërarchische structuur van een XML document. Een element kan naast
sub-elementen en/of tekst ook attributen bevatten. Attributen zijn eigenschappen
van een element, en worden in de begin-tag aangegeven met attribuut="waarde". Een
attribuut mag maximaal één keer gebruikt worden in een element, dit in tegenstelling
tot sub-elementen, waarvan er meerdere dezelfde elementen ingevoegd mogen worden.
Afbeelding 3 dat een stoel beschrijft laat dit duidelijk zien.
1: <stoelen>
2: <stoel>
3: <poot hoogte="40"/>
4: <poot hoogte="40"/>
5: <poot hoogte="40"/>
6: <poot hoogte="40"/>
7: <leuning hoogte="60" breedte="40"/>
8: </stoel>
9: </stoelen>
Afbeelding 3, XML beschrijving van een stoel
De voordelen van XML
XML is voor alles erg eenvoudig. Zolang je je aan de grammaticaregels houdt, heb
je goed gevormde (well-formed) XML, en heb je dus al iets dat gegevens bevat.
XML is verder tekst en nog leesbaar door mensen ook, omdat de betekenis van de
elementen en de attributen door de naam zelf wordt aangegeven. Je hoeft dus niet
met allerlei vreemde tekens aan de gang, en je hoeft ook niet te gokken wat de
betekenis is, zoals bijvoorbeeld met een kommagescheiden bestand. Je kunt XML
daarom met iedere tekst editor wijzigen, hoewel er ook zeker meer geavanceerde
tools zijn. XML leent zich door al deze eigenschappen onder andere goed voor
configuratiebestanden. Microsoft is bijvoorbeeld voor dat soort bestanden van
het al oude .ini formaat afgestapt ten faveure van XML. De grote kracht van XML
is echter het universele karakter, en dat het een standaard is die ontwikkeld is
door het W3 Consortium (W3C) dat ook onder andere HTML heeft ontwikkeld. Doordat
het een standaard is en met de hiërarchische structuur van XML bijna alle
gegevensstructuren te beschrijven zijn, is XML de meest universele manier om
gegevens op te slaan en uit te wisselen. Zo kun je gegevens uit een relationele
database eenvoudig vatten in een XML bestand, en is het mogelijk om een
representatie van een object in een programma beschrijven. Het Simple Object
Access Protocol (SOAP) maakt gebruik die objectrepresentatie bij het communiceren
met andere machines.
XML lezen en bewerken
Om XML te lezen en bewerken kun je gebruik maken van verschillende methodes. Er
zijn verschillende editors, maar je kunt zoals gezegd ook met een teksteditor
werken. Voor ontwikkelaars is er de keuze uit het Document Object Model (DOM),
Simple API for XML (SAX), en enkele platform specifieke mogelijkheden. DOM is een
standaard van het W3C die gebruik maakt van de boomstructuur van XML. Met DOM kun
je door de elementen en attributen heen lopen, en kun je bepaalde elementen selecteren.
Met een groot XML document kunnen er echter problemen ontstaan, omdat het hele
document hiervoor in het geheugen moet zitten. SAX, de de facto standaard naast
DOM, heeft dat probleem niet, maar heeft ook nooit op een moment het hele document
ter beschikking. Dit model werkt namelijk op basis van het aanroepen van bepaalde
functionaliteit als een bepaald element of attribuut gevonden wordt. Het .NET
Framework van Microsoft leunt zeer zwaar op XML, en heeft nog een derde interessante
optie waarbij met een soort cursor door het bestand heen gelopen kan worden. In
dat model, dat men de XmlReader noemt, heb je net als bij SAX weinig geheugen
nodig, maar heb je meer controle dan SAX.
DOM, SAX, en de XmlReader zijn voorbeelden van XML parsers. Met een parser worden
XML bestanden ingelezen om te kunnen gebruiken en bewerken. Met DOM kun je een
document in het geheugen wijzigen en daarna wegschrijven. Omdat SAX en XmlReader
geen representatie van een bestand in het geheugen hebben, kun je daarmee
feitelijk alleen een nieuw document maken, en het oude document daarmee vervangen.
Wil je XML echt manipuleren, kun je ongeacht het type parser ook gebruik maken
van de Extensible Stylesheet Language Transformations (XSLT). Dit is een taal
waarmee je een XML bestand kunt transformeren naar andere formaten, bijvoorbeeld
HTML of platte tekst. Zoals je kunt zien in afbeelding 4 is XSLT zelf ook XML,
en dus op dezelfde manier te lezen en bewerken. Voor het aanwijzen van elementen
en attributen maakt XSLT gebruik van XPath, dat werkt op basis van paden en
predikaten om te selecteren en te filteren. Om bijvoorbeeld uit een document als
in Afbeelding 3 alle stoelen te selecteren met een leuning van 60 centimeter hoog,
zou je de volgende expressie gebruiken: /stoelen/stoel[leuning/@hoogte=60]. XSLT
en XPath zijn standaarden die net als XML door het W3C ontwikkeld zijn, en in
combinatie met andere XML standaarden gebruikt kunnen worden. XPath wordt ook
gebruikt in andere standaarden, zoals XPointer, en in de toekomst in XQuery dat
momenteel nog onder ontwikkeling is. Neem voor informatie over deze en andere XML
standaarden eens een kijkje op www.w3.org, de site van het W3C.
1: <?xml version="1.0" encoding="UTF-8"?>
2: <xsl:stylesheet version="1.0"
3: xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
4:
5: <xsl:template match="/">
6: <xsl:for-each select="stoelen/stoel">
7: <xsl:text>Stoel (hoogte x breedte): </xsl:text>
8: <xsl:value-of select="@hoogte" />
9: <xsl:text> x </xsl:text>
10: <xsl:value-of select="@breedte" />
11: <xsl:text>
</xsl:text>
12: </xsl:for-each>
13: </xsl:template>
14: </xsl:stylesheet>
Afbeelding 4, XSLT voor het weergeven van stoelen
Topje van de ijsberg
XML omvat veel meer dan alleen de XML 1.0 specificatie, de basis van XML. Om XML
heen zijn veel standaarden ontwikkeld die het werken met XML alleen maar beter en
makkelijker maken. XML Schema, XML Namespaces, XSLT, XPath, XPointer, XLink,
XHTML, XML Encryption en XML Signature, de lijst is aanzienlijk en nog steeds
groeiende. XML wordt daarmee alleen maar belangrijker, en het zal ook niet lang
meer duren voor vrijwel elk systeem met XML overweg kan. Het is zelfs niet
ondenkbaar dat XML op den duur alle andere gegevens- en communicatieformaten zal
vervangen.
Dit artikel is eerder verschenen in NetOpus, maart 2004.
|