XML

Wat is een XML-bestand?

De omslachtige voorvader van JSON. Nog steeds de ruggengraat van gegevensuitwisseling tussen bedrijven en overheden.

Wat XML is

XML is een puur tekstformaat dat in elke editor opengaat. Het wordt gebruikt voor gegevens tussen programma’s verplaatsen.

De extensie is .xml en de volledige naam Extensible Markup Language. Allebei zeggen ze minder dan wat het bestand kan bevatten, en daar gaat de rest van deze pagina over.

Waar XML vandaan komt

W3C bracht het in 1998 uit. De specificatie is XML 1.0.

Aan een formaat dat zo lang leesbaar is gebleven kun je iets toevertrouwen dat je over tien jaar terug wilt hebben.

De specificatie is openbaar

Ze is volledig gepubliceerd, dus wie het formaat wil uitvoeren kan dat uit het document doen in plaats van door te kijken hoe anderen het doen. Daarom duikt het in zo veel programma’s op, en daarom gaan bestanden van twintig jaar geleden nog steeds open. Openbaar is niet hetzelfde als royaltyvrij: waar een formaat een codec omhult, is de octrooilicentie een aparte vraag waarop de standaard geen antwoord geeft.

Er wordt niets weggegooid

XML bewaart zijn inhoud precies. Opnieuw opslaan verandert niets, dus je kunt het zo vaak openen, bewerken en wegschrijven als je wilt zonder dat er schade opstapelt — en dat is wat er een werkformaat van maakt in plaats van een afleverformaat.

Je kunt er aantekeningen in kwijt

XML heeft een commentaarsyntaxis — dat is het verschil tussen een bestand dat een mens onderhoudt en een bestand dat een programma schrijft. Bij het converteren naar een formaat zonder commentaar zijn ze het eerste wat verdwijnt, en er wordt niet gewaarschuwd.

Wat XML opent

Visual Studio Code en oXygen XML Editor lezen het, en de meeste programma’s van dezelfde soort ook.

Als een bestand niet opengaat ligt het zelden aan het formaat — vaker is het programma ouder dan het formaat. Converteren naar iets ouders is de betrouwbare weg eromheen, en daarvoor is de rest van deze site bedoeld.

Het in de browser openen

Elke actuele browser leest het.

Je kunt het dus zonder zorgen op een pagina zetten of aan een bericht hangen, zonder je af te vragen wat de andere kant geïnstalleerd heeft.

Het is een werkformaat

XML is bedoeld om te openen en te wijzigen. Houd het bestand in dit formaat zolang het werk loopt, en exporteer eruit wanneer er een afgeronde versie nodig is.

Een manier om structuur op te schrijven, geen formaat

XML beschrijft op zichzelf niets. Het is een set regels om een document te markeren met geneste elementen en attributen, en de betekenis komt van welke woordenschat erbovenop gebouwd is — RSS, SVG, SOAP, sitemapbestanden, de binnenkant van elk Office- en OpenDocument-bestand.

"Een XML-bestand" zegt dus evenveel over de inhoud als "een tekstbestand". Wat telt is welke woordenschat het volgt, meestal gedeclareerd in het hoofdelement of via een schema waar het document naar verwijst.

Wel-gevormd en geldig zijn verschillende woorden

Wel-gevormd betekent dat de syntax correct is: één hoofdelement, elke tag gesloten, elementen netjes genest, attributen tussen aanhalingstekens, en & en < ontsnapt waar ze als tekst bedoeld zijn. Een parser weigert al het overige — XML is bewust strikt, en anders dan HTML is er geen foutherstel.

Geldig betekent bovendien voldoen aan een schema: dit element mag die elementen bevatten, dit attribuut is verplicht, deze waarde moet een datum zijn. Een document kan perfect wel-gevormd zijn en volledig verkeerd voor zijn doel, en een validerende parser vangt dat verschil.

Namespaces, en de bugs die ze veroorzaken

Namespaces bestaan zodat twee woordenschatten gecombineerd kunnen worden zonder dat hun elementnamen botsen. Een namespace wordt geïdentificeerd met een URI, wat een naam is en geen adres: er wordt niets van opgehaald.

Ze zijn ook de grootste bron van XML-parseerbugs. Een query geschreven zonder rekening te houden met de namespace van een element matcht stilletjes niets, terwijl het document er voor een mens correct uitziet. Beweert een parser dat een element niet bestaat terwijl je er recht naar kijkt, controleer dan eerst de namespace.

De coderingsverklaring is geen decoratie

De eerste regel van een net XML-bestand verklaart de versie en de tekencodering. Anders dan een gewoon tekstbestand maakt dit de codering deel van het document in plaats van een gok.

Twee gevolgen om te kennen. Een bestand dat de ene codering verklaart en als een andere is opgeslagen, is kapot op een manier die verwarrende parseerfouten geeft in plaats van zichtbaar verkeerde tekens. En een byte-order-mark voor de verklaring stoort sommige parsers.

Externe entiteiten zijn een echt veiligheidsprobleem

XML heeft een mechanisme voor afkortingen — een entiteit — en klassiek kon die naar een externe bron wijzen. Een parser die dat oplost, leest lokale bestanden of doet netwerkverzoeken namens wie het document aanleverde.

Dat is de XXE-kwetsbaarheid, en die heeft echte inbreuken veroorzaakt. Een verwante truc, de billion-laughs-aanval, nest entiteitsdefinities zodat een klein bestand tot gigabytes uitzet. Of externe entiteiten standaard worden opgelost, verschilt per bibliotheek — controleer de instelling in plaats van hem aan te nemen.

Het gereedschap is waarom XML overleeft

XPath adresseert elk deel van een document met een compacte uitdrukking. XSLT transformeert het ene XML-document naar het andere, of naar HTML of tekst, declaratief. XSD definieert en handhaaft een schema. Alle drie zijn standaarden, alle drie volwassen.

Dit is wat mensen bedoelen als ze zeggen dat XML omslachtig maar krachtig is. De haakjes zijn de prijs; de query-, transformatie- en validatiemachinerie is wat er gekocht wordt.

Er eentje lezen, bewerken en omzetten

Elke teksteditor opent het, en een editor met XML-ondersteuning is de moeite waard: hij vouwt secties in, controleert wel-gevormdheid tijdens het typen, en maakt een bestand dat als één enorme regel aankwam netjes op.

Omzetten naar JSON is gangbaar en verliesgevend in één richting: attributen hebben geen JSON-equivalent en krijgen een verzonnen sleutelnaam, en gemengde inhoud heeft helemaal geen representatie. Gegevensvormige XML zet netjes om; documentvormige XML overleeft de heen-en-weerreis niet.

De gegevens, op één plek

Kenmerken en herkomst van het formaat XML.
Extensie.xml
Mediatypeapplication/xml, text/xml
Uitgegeven doorW3C
Voor het eerst gepubliceerd1998
SpecificatieXML 1.0