Als je ooit met legacy enterprise-API's hebt gewerkt, RSS-feeds hebt geconsumeerd, een .docx-bestand hebt geopend of een SVG hebt getekend, heb je XML gebruikt — ook al wist je het niet. XML drijft meer van de softwarewereld aan dan de meeste ontwikkelaars zich realiseren. Het is ouder dan JSON, uitgebreider en complexer — maar ook krachtiger in specifieke contexten. Dit is een praktische gids over wat XML eigenlijk is, hoe het werkt, en wanneer het nog steeds zinvol is om het te gebruiken.

XML staat voor eXtensible Markup Language. Het W3C publiceerde de XML 1.0-specificatie in 1998, en het werd het dominante gegevensuitwisselingsformaat van de vroege webtijd. Het "uitbreidbare" deel is essentieel: anders dan HTML, dat een vaste reeks tags heeft, kun je met XML je eigen tags definiëren om elke gegevensstructuur te beschrijven die je nodig hebt.

Hoe XML Eruitziet

Hier is een volledig XML-document dat een product van een e-commerce API vertegenwoordigt. Dit dekt alle kernsyntaxfuncties die je zult tegenkomen:

xml
<?xml version="1.0" encoding="UTF-8"?>
<product id="SKU-8821" inStock="true">
  <name>Wireless Noise-Cancelling Headphones</name>
  <brand>SoundCore</brand>
  <price currency="USD">149.99</price>
  <categories>
    <category>Electronics</category>
    <category>Audio</category>
    <category>Accessories</category>
  </categories>
  <specs>
    <spec name="battery">30 hours</spec>
    <spec name="connectivity">Bluetooth 5.2</spec>
    <spec name="weight">250g</spec>
  </specs>
  <description>
    Premium wireless headphones with active noise cancellation,
    30-hour battery life, and foldable design.
  </description>
</product>

Laten we de onderdelen analyseren. De eerste regel is de XML-declaratie — die vertelt parsers dat dit XML 1.0 is gecodeerd in UTF-8. De tag <product> is het rootelement (elk XML-document heeft er precies één). De delen id en inStock op diezelfde tag zijn attributen. Alles binnen de openings- en sluitingstags is een onderliggend element, een attribuut of tekstinhoud.

Elementen vs Attributen — Een Echte Ontwerpkeuze

Iets wat nieuwe XML-auteurs in verwarring brengt: je kunt dezelfde gegevens weergeven als element of als attribuut. Beide zijn geldige XML voor hetzelfde stuk data:

xml
<!-- Als attribuut -->
<price currency="USD">149.99</price>

<!-- Als onderliggend element -->
<price>
  <amount>149.99</amount>
  <currency>USD</currency>
</price>

De gangbare wijsheid: gebruik attributen voor metadata over het element (identificatoren, vlaggen, eenheden), en gebruik onderliggende elementen voor de werkelijke gegevensinhoud — vooral als die inhoud complex kan worden, herhaald kan worden of in de toekomst zijn eigen attributen nodig heeft. Attributen kunnen alleen platte tekst bevatten; onderliggende elementen kunnen elke XML-structuur bevatten.

Goed Gevormd vs Geldig — Twee Verschillende Standaarden

XML kent twee niveaus van correctheid die vaak worden verward:

  • Goed gevormd XML volgt de basisregels voor de syntaxis: één rootelement, alle tags correct gesloten, attributen tussen aanhalingstekens, geen illegale tekens. Elke XML-parser kan dit controleren.
  • Geldig XML voldoet aan een specifiek schema — ofwel een DTD (Document Type Definition) of een XML Schema (XSD). Geldigheidscontrole vereist zowel het document als het schema. Je kunt goed gevormd XML hebben dat niet geldig is ten opzichte van een bepaald schema.
In de praktijk: de meeste enterprise XML-integraties geven om geldigheid, niet alleen om goed gevormd zijn. Als je een SOAP-integratie bouwt of HL7-zorgdossiers uitwisselt, definieert het schema precies welke elementen vereist zijn, welke typen ze bevatten en welke waarden zijn toegestaan. Gebruik de XML Validator om goed gevormd zijn snel te controleren.

Waar XML in de Praktijk Voorkomt

  • SOAP-webservices. De oudere helft van enterprise-software draait nog steeds op SOAP — bank-API's, ERP-systemen, betalingsgateways. Elk SOAP-bericht is een goed gedefinieerd XML-document met een Envelope, Header en Body.
  • RSS- en Atom-feeds. Elke podcastfeed, nieuwssitefeed en YouTube-kanaalsabonnement is een XML-document. RSS 2.0 en Atom zijn beide op XML gebaseerde formaten die al bestaan sinds de vroege jaren 2000.
  • SVG-afbeeldingen. Scalable Vector Graphics is XML. Wanneer je een .svg-bestand opent in een teksteditor, lees je XML. Daarom kun je SVG's stijlen met CSS en manipuleren met JavaScript.
  • Office-documenten. Een .docx-, .xlsx- of .pptx-bestand is een ZIP-archief met XML-bestanden. Office Open XML is de manier waarop Microsoft alle moderne Office-documentformaten opslaat.
  • Android-layouts. Android UI-layouts zijn gedefinieerd in XML-bestanden. Als je Android-development hebt gedaan, heb je veel XML geschreven.
  • Maven en pom.xml. Het Maven-buildsysteem van Java gebruikt een pom.xml-bestand om projectafhankelijkheden en buildconfiguratie te definiëren — bekend bij elke Java-ontwikkelaar.

XML Parsen in JavaScript — DOMParser

In de browser kun je XML-strings parsen met de ingebouwde DOMParser-API. Het werkt op dezelfde manier als HTML parsen:

js
const xmlString = `<?xml version="1.0"?>
<product id="SKU-8821">
  <name>Wireless Headphones</name>
  <price currency="USD">149.99</price>
  <categories>
    <category>Electronics</category>
    <category>Audio</category>
  </categories>
</product>`;

const parser = new DOMParser();
const doc = parser.parseFromString(xmlString, 'application/xml');

// Controleer op parseerfouten
const parseError = doc.querySelector('parsererror');
if (parseError) {
  console.error('XML parse error:', parseError.textContent);
} else {
  const name = doc.querySelector('name').textContent;
  const currency = doc.querySelector('price').getAttribute('currency');
  const categories = [...doc.querySelectorAll('category')].map(el => el.textContent);

  console.log(name);       // Wireless Headphones
  console.log(currency);   // USD
  console.log(categories); // ['Electronics', 'Audio']
}

XML Parsen in Python — ElementTree

De standaardbibliotheek van Python bevat xml.etree.ElementTree — geen externe pakketten nodig voor eenvoudig XML-parsen:

python
import xml.etree.ElementTree as ET

xml_string = """<?xml version="1.0"?>
<product id="SKU-8821">
  <name>Wireless Headphones</name>
  <price currency="USD">149.99</price>
  <categories>
    <category>Electronics</category>
    <category>Audio</category>
  </categories>
</product>"""

root = ET.fromstring(xml_string)

name = root.find('name').text
currency = root.find('price').get('currency')
categories = [el.text for el in root.findall('categories/category')]

print(name)        # Wireless Headphones
print(currency)    # USD
print(categories)  # ['Electronics', 'Audio']

De Valkuilen die XML-auteurs Verrassen

  • Entiteitscodering. Vijf tekens moeten worden geëscaped in XML-tekst en attribuutwaarden: &&amp;, <&lt;, >&gt;, "&quot;, '&apos;. Vergeten een ampersand in een URL te escapen breekt het hele document.
  • Namespaces. Naamruimte-XML ziet eruit als <soap:Envelope xmlns:soap="...">. Queries zonder namespace-bewustzijn vinden geen elementen. Dit is een van de meest voorkomende XML-parseerfouten.
  • Gevoeligheid voor witruimte. Witruimte tussen elementen is technisch gezien betekenisvol in XML (anders dan in HTML). De meeste parsers verwerken dit verstandig, maar het kan voor verrassingen zorgen bij het vergelijken van documenten.
  • Tekencodering. De XML-declaratie moet overeenkomen met de werkelijke bestandscodering. Een UTF-8-bestand gedeclareerd als ISO-8859-1 wordt onjuist geparseerd voor niet-ASCII-tekens.
  • Geen native array-type. XML heeft geen arrays. Lijsten worden weergegeven door elementen te herhalen, wat betekent dat parsers NodeLists retourneren in plaats van JavaScript-arrays — converteer altijd met Array.from() of spread.

Handige XML-tools om te Kennen

Werk je regelmatig met XML? Deze tools besparen je tijd: XML Formatter om geminimaliseerde XML-responses op te maken, XML Validator om goed gevormd zijn te controleren, XML naar JSON om XML-responses te converteren naar JSON voor eenvoudigere verwerking, en XML XPath om XPath-query's te testen op een document.

Samenvatting

XML is uitgebreid en complex vergeleken met JSON, maar het is geen legacy-voetnoot — het is de basis van SVG, Office-documenten, RSS-feeds, SOAP-services en Android-UI's. Het begrijpen van het onderscheid tussen element en attribuut, het verschil tussen goed gevormd en geldig XML, en de veelvoorkomende valkuilen rond entiteitscodering en namespaces zal je goed van pas komen wanneer XML in je werk opduikt. En dat zal het.