4.1 XML als uitwisselingsformaat

Kent XML als uitwisselingsformaat (structuur, syntax, schema’s).

Wat is XML?

XML (eXtensible Markup Language) is een markup-taal ontworpen voor het opslaan en transporteren van gestructureerde data. In de overheidscontext is XML de ruggengraat van vele uitwisselingstandaarden, waaronder StUF (Standaard Uitwisseling Formaat).

Kernprincipes van XML:

  • Self-describing: Data en structuur in één formaat
  • Human-readable: Leesbaar voor mensen én machines
  • Platform-independent: Werkt op alle systemen
  • Extensible: Flexibel uitbreidbaar voor specific behoeften

XML-structuur en syntax

Basis XML-elementen

<?xml version="1.0" encoding="UTF-8"?>
<BRP:Persoon xmlns:BRP="http://www.stufstandaarden.nl/basisgegevens">
    <BRP:BSN>123456789</BRP:BSN>
    <BRP:Geslachtsnaam>
        <BRP:Voorvoegsel>van der</BRP:Voorvoegsel>
        <BRP:GeslachtsnaamStam>Berg</BRP:GeslachtsnaamStam>
    </BRP:Geslachtsnaam>
    <BRP:Voornamen>Jan Peter</BRP:Voornamen>
    <BRP:Geboortedatum>1985-03-15</BRP:Geboortedatum>
</BRP:Persoon>

Syntax-regels

  • Case-sensitive: <Persoon><persoon>
  • Well-formed: Elke opening-tag heeft matching closing-tag
  • Nested structure: Elementen kunnen elementen bevatten
  • Attribute syntax: <element attribuut="waarde">

Namespaces

<!-- Namespace declaraties -->
<StUF:Bv03Bericht 
    xmlns:StUF="http://www.stufstandaarden.nl/koppelvlak/stuf"
    xmlns:BG="http://www.stufstandaarden.nl/onderlaag/bg" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
    <StUF:stuurgegevens>
        <StUF:berichtCode>Lv01</StUF:berichtCode>
        <StUF:zender>
            <StUF:organisatie>0363</StUF:organisatie>
        </StUF:zender>
    </StUF:stuurgegevens>
</StUF:Bv03Bericht>

XML Schema’s (XSD)

XML Schema Definition (XSD) definieert de structuur, elementen en datatypes van XML-documenten.

Simpel XSD-voorbeeld

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.example.com/persoon"
           xmlns:tns="http://www.example.com/persoon">

    <!-- Complex type voor Persoon -->
    <xs:complexType name="PersoonType">
        <xs:sequence>
            <xs:element name="BSN" type="xs:string"/>
            <xs:element name="Voornaam" type="xs:string"/>
            <xs:element name="Achternaam" type="xs:string"/>
            <xs:element name="Geboortedatum" type="xs:date"/>
        </xs:sequence>
    </xs:complexType>

    <!-- Root element -->
    <xs:element name="Persoon" type="tns:PersoonType"/>
</xs:schema>

XSD-features voor overheidsgebruik

Datatype-restricties:

<!-- BSN validatie -->
<xs:simpleType name="BSNType">
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{9}"/>
        <xs:length value="9"/>
    </xs:restriction>
</xs:simpleType>

<!-- Postcode validatie -->
<xs:simpleType name="PostcodeType">
    <xs:restriction base="xs:string">
        <xs:pattern value="[1-9][0-9]{3} ?[A-Za-z]{2}"/>
    </xs:restriction>
</xs:simpleType>

Enumeraties voor codelijsten:

<xs:simpleType name="GeslachtType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="M"/>
        <xs:enumeration value="V"/>
        <xs:enumeration value="O"/>
    </xs:restriction>
</xs:simpleType>

XML in StUF-context

StUF-berichtstructuur

<StUF:Bv03Bericht>
    <StUF:stuurgegevens>
        <StUF:berichtCode>Lv01</StUF:berichtCode>
        <StUF:zender>
            <StUF:organisatie>0363</StUF:organisatie>
            <StUF:applicatie>BRP-System</StUF:applicatie>
        </StUF:zender>
        <StUF:ontvanger>    
            <StUF:organisatie>0518</StUF:organisatie>
            <StUF:applicatie>Zaak-System</StUF:applicatie>
        </StUF:ontvanger>
        <StUF:referentieNummer>REF-2024-001</StUF:referentieNummer>
        <StUF:tijdstempel>2024-03-05T14:30:00</StUF:tijdstempel>
    </StUF:stuurgegevens>
    
    <StUF:body>
        <StUF:vraag>
            <StUF:filter>
                <BG:BSN>123456789</BG:BSN>
            </StUF:filter>
        </StUF:vraag>
    </StUF:body>
</StUF:Bv03Bericht>

XML-processing tools

Validatie-tools

  • xmllint: Command-line XML validator (Linux/Mac)
  • XML Spy: Commercial XML-editor met validatie
  • Oxygen XML Editor: Professional XML development
  • Online validators: Voor quick checks

Programming libraries

Java:

// DOM parsing
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new File("bericht.xml"));

// XPath queries  
XPath xpath = XPathFactory.newInstance().newXPath();
String bsn = xpath.compile("//BRP:BSN/text()").evaluate(doc);

Python:

import xml.etree.ElementTree as ET

# Parse XML
tree = ET.parse('bericht.xml')
root = tree.getroot()

# Find elements
bsn = root.find('.//{namespace}BSN').text

C#:

// XDocument (LINQ to XML)
XDocument doc = XDocument.Load("bericht.xml");
var bsn = doc.Descendants("BSN").First().Value;

// XmlDocument (legacy approach)
XmlDocument doc = new XmlDocument();
doc.Load("bericht.xml");

XML Best practices voor overheidstoepassingen

Performance-optimalisatie

  • Streaming: Gebruik SAX/StAX voor grote bestanden
  • Indexing: XPath-performance met indices verbeteren
  • Compression: GZIP voor transport van grote XML-berichten

Security-overwegingen

<!-- XXE Prevention: Disable external entities -->
<?xml version="1.0"?>
<!DOCTYPE data [
    <!ENTITY harmless "safe data">
    <!-- Nooit external entities toestaan -->
]>

Maintainability

  • Consistent naming: CamelCase vs snake_case conventions
  • Clear namespaces: Herkenbare URI’s gebruiken
  • Documentation: Annotated XSD’s voor business-betekenis

Veelvoorkomende XML-problemen

Character encoding issues

<!-- Correct encoding-declaratie -->
<?xml version="1.0" encoding="UTF-8"?>

<!-- Common problems -->
- Encoding mismatch tussen declaratie en actual file-encoding
- Special characters niet-properly escaped (&amp; &lt; &gt;)
- BOM (Byte Order Mark) in sommige tools

Namespace-complicaties

<!-- Probleem: Default namespace overschrijft child-namespaces -->
<root xmlns="http://default.com">
    <child xmlns="http://other.com">data</child>
</root>

<!-- Oplossing: Expliciete prefixes -->
<def:root xmlns:def="http://default.com" xmlns:other="http://other.com">
    <other:child>data</other:child>
</def:root>

XML vs andere formaten

Voordelen van XML:

  • Rich metadata: Attributes én element-content
  • Schema validation: Strenge type-checking mogelijk
  • Industry adoption: Brede tool-support
  • XSLT transformations: Powerful formatting-capabilities

Nadelen van XML:

  • Verbosity: Veel markup-overhead
  • Parsing-cost: Meer CPU/memory dan JSON
  • Complexity: Learning-curve voor developers
  • File sizes: Groter dan binary-alternatives

Toekomst van XML in overheidscontext

Legacy-ondersteuning

XML blijft relevant voor:

  • Bestaande StUF-implementaties: Miljoenen berichten per dag
  • Legal-compliance: Sommige wet- en regelgeving specificeert XML
  • Enterprise-integration: SOAP-based systemen in large organizations

Evolutie naar APIs

  • REST/JSON: Moderne APIs kiezen vaak voor eenvoudiger formaten
  • GraphQL: Query-language voor flexible data-retrieval
  • Protocol Buffers: High-performance binary alternatives

Hybride aanpak:

LegacysystemsXMLTranslationlayerJSONModernAPIs

Het begrijpen van XML blijft essentieel voor overheidsmedewerkers die werken met gegevensuitwisseling, ook in een tijd waarin nieuwe technologieën dominant worden. XML-expertise faciliteert zowel onderhoud van legacy-systemen als migratie naar modernere architecturen.

Resources: