Hvis du har arbejdet med ældre enterprise API'er, forbrugt RSS-feeds, åbnet en .docx-fil eller tegnet en SVG, har du brugt XML — selvom du ikke vidste det. XML driver mere af softwareverdenen, end de fleste udviklere er klar over. Det er ældre end JSON, mere omstændeligt og mere komplekst — men også mere kapabelt i specifikke sammenhænge. Dette er en praktisk guide til, hvad XML faktisk er, hvordan det virker, og hvornår det stadig giver mening at bruge det.

XML står for eXtensible Markup Language (Udvidbart Markup-sprog). W3C offentliggjorde XML 1.0-specifikationen i 1998, og det blev det dominerende dataudvekslingsformat i webbens tidlige æra. Delen "udvidbar" er nøglen: i modsætning til HTML, der har et fast sæt tags, lader XML dig definere dine egne tags til at beskrive enhver datastruktur, du har brug for.

Sådan ser XML ud

Her er et komplet XML-dokument, der repræsenterer et produkt fra et e-handels-API. Det dækker alle kernesyntaksfunktioner, du vil støde på:

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>

Lad os gennemgå de vigtigste dele. Den første linje er XML-deklarationen — den fortæller parsere, at dette er XML 1.0 kodet i UTF-8. Tagget <product> er rodelementet (hvert XML-dokument har præcis ét). Delene id og inStock på det samme tag er attributter. Alt inde i åbnings- og lukkningstaggende er enten underelementer, attributter eller tekstindhold.

Elementer vs. attributter — en reel designbeslutning

Noget, der forvirrer nye XML-forfattere: du kan repræsentere de samme data som et element eller som en attribut. Begge disse er gyldig XML for det samme stykke data:

xml
<!-- Som en attribut -->
<price currency="USD">149.99</price>

<!-- Som et underelement -->
<price>
  <amount>149.99</amount>
  <currency>USD</currency>
</price>

Den konventionelle visdom: brug attributter til metadata om elementet (identifikatorer, flag, enheder) og brug underelementer til det faktiske dataindhold — især hvis det indhold kan blive komplekst, gentaget eller have brug for sine egne attributter i fremtiden. Attributter kan kun indeholde ren tekst; underelementer kan indeholde enhver XML-struktur.

Velformet vs. gyldig — to forskellige standarder

XML har to niveauer af korrekthed, der ofte forveksles:

  • Velformet XML følger de grundlæggende syntaksregler: ét rodelement, alle tags korrekt lukket, attributter i anførselstegn, ingen ulovlige tegn. Enhver XML-parser kan kontrollere dette.
  • Gyldig XML er i overensstemmelse med et specifikt skema — enten et DTD (Document Type Definition) eller et XML Schema (XSD). Gyldigheds-tjek kræver både dokumentet og skemaet. Du kan have velformet XML, der ikke er gyldig i henhold til et bestemt skema.
I praksis: de fleste enterprise XML-integrationer bekymrer sig om gyldighed, ikke blot velformethed. Hvis du bygger en SOAP-integration eller udveksler HL7 sundhedsrecords, definerer skemaet præcis, hvilke elementer der er påkrævet, hvilke typer de indeholder, og hvilke værdier der er tilladt. Brug XML Validator til hurtigt at kontrollere velformethed.

Steder i den virkelige verden, hvor XML optræder

  • SOAP-webtjenester. Den ældre halvdel af enterprise-software kører stadig på SOAP — bank-API'er, ERP-systemer, betalingsgateways. Hver SOAP-besked er et veldefineret XML-dokument med en Envelope, Header og Body.
  • RSS- og Atom-feeds. Hvert podcast-feed, nyheds-feed og YouTube-kanalabonnement er et XML-dokument. RSS 2.0 og Atom er begge XML-baserede formater, der har eksisteret siden begyndelsen af 2000'erne.
  • SVG-billeder. Skalerbar vektorgrafik er XML. Når du åbner en .svg-fil i en teksteditor, læser du XML. Det er derfor, du kan style SVG'er med CSS og manipulere dem med JavaScript.
  • Office-dokumenter. En .docx-, .xlsx- eller .pptx-fil er et ZIP-arkiv, der indeholder XML-filer. Office Open XML er den måde, Microsoft gemmer alle moderne Office-dokumentformater.
  • Android-layouts. Android UI-layouts er defineret i XML-filer. Hvis du har drevet Android-udvikling, har du skrevet meget XML.
  • Maven og pom.xml. Javas Maven-byggesystem bruger en pom.xml-fil til at definere projektafhængigheder og byggekonfiguration — velkendt for enhver Java-udvikler.

Parsing af XML i JavaScript — DOMParser

I browseren kan du parse XML-strenge ved hjælp af den indbyggede DOMParser-API. Det fungerer på samme måde som parsing af HTML:

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');

// Tjek for parse-fejl
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']
}

Parsing af XML i Python — ElementTree

Pythons standardbibliotek inkluderer xml.etree.ElementTree — ingen tredjeparts-pakker er nødvendige til grundlæggende XML-parsing:

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']

Fælder der bider XML-forfattere

  • Entitetskodning. Fem tegn skal escapes i XML-tekst og attributværdier: &&amp;, <&lt;, >&gt;, "&quot;, '&apos;. At glemme at escape et ampersand i en URL ødelægger hele dokumentet.
  • Navnerum. XML med navnerum ser ud som <soap:Envelope xmlns:soap="...">. Forespørgsler uden navnerumsopmærksomhed vil ikke finde elementer. Dette er en af de mest almindelige XML-parsing-fejl.
  • Mellemrumsfølsomhed. Mellemrum mellem elementer er teknisk set betydningsfuldt i XML (i modsætning til HTML). De fleste parsere håndterer det fornuftigt, men det kan forårsage overraskelser ved sammenligning af dokumenter.
  • Tegnkodning. XML-deklarationen bør matche den faktiske filkodning. En UTF-8-fil deklareret som ISO-8859-1 vil blive parset forkert for alle ikke-ASCII-tegn.
  • Ingen indbygget array-type. XML har ikke arrays. Du repræsenterer lister ved at gentage elementer, hvilket betyder, at parsere returnerer NodeLists snarere end JavaScript-arrays — konverter altid med Array.from() eller spread.

XML-værktøjer det er værd at kende

Arbejder du regelmæssigt med XML? Disse værktøjer sparer dig tid: XML Formatter til at formatere minificerede XML-svar, XML Validator til at kontrollere velformethed, XML to JSON til at konvertere XML-svar til JSON for nemmere håndtering, og XML XPath til at teste XPath-forespørgsler mod et dokument.

Opsummering

XML er mere omstændeligt og komplekst end JSON, men det er ikke et fortidsminde — det er fundamentet for SVG, Office-dokumenter, RSS-feeds, SOAP-tjenester og Android-brugergrænseflader. At forstå element/attribut-distinktionen, forskellen mellem velformet og gyldig XML samt de almindelige fælder omkring entitetskodning og navnerum vil tjene dig godt, når XML dukker op i dit arbejde. Og det vil det.