Signatur
Beschreibung
Mit DOMParser baust du aus einem Text-String einen vollständigen DOM-Baum, den du mit den üblichen DOM-Methoden wie querySelector(), getElementsByTagName() oder textContent durchsuchen und auswerten kannst. Die Schnittstelle hat genau eine Methode: parseFromString(string, mimeType). Sie gibt je nach MIME-Typ ein Document (HTML) oder ein XMLDocument (XML, SVG, XHTML) zurück.
Typische Einsatzfälle sind das Auswerten von XML-Antworten (RSS-/Atom-Feeds, SOAP, Konfigurationsdateien), das Auslesen von Daten aus per fetch() geladenen HTML-Seiten, das Laden von SVG-Markup als DOM oder das sichere Vorab-Prüfen von HTML-Fragmenten, bevor Teile davon ins sichtbare Dokument übernommen werden.
Das erzeugte Dokument ist vom aktuellen Dokument getrennt: Es wird nicht gerendert, Skripte darin werden nicht ausgeführt und Ressourcen wie Bilder werden beim Parsen nicht geladen. Knoten daraus kannst du mit document.importNode() oder document.adoptNode() (bzw. implizit durch append()) ins eigene Dokument übernehmen.
Wichtig: Der DOMParser wirft bei fehlerhaftem XML keine Ausnahme. Stattdessen enthält das Ergebnis-Dokument ein <parsererror>-Element, das du selbst prüfen musst. HTML wird dagegen immer fehlertolerant geparst, so wie es der Browser auch bei normalen Seiten tut.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | TrustedHTML | Der zu parsende Quelltext. Bei aktivierten Trusted Types muss bei "text/html" ein TrustedHTML-Objekt übergeben werden. |
|
| $mimeType Pflicht | "text/html" | "text/xml" | "application/xml" | "application/xhtml+xml" | "image/svg+xml" | Legt den Parser fest: "text/html" nutzt den HTML-Parser und liefert ein Document, alle anderen Werte nutzen den XML-Parser und liefern ein XMLDocument. Andere Werte führen zu einem TypeError. |
Rückgabewert
new DOMParser() liefert eine Parser-Instanz. Deren Methode parseFromString() gibt ein neues, eigenständiges Document (bei "text/html") bzw. XMLDocument (bei XML-Typen) zurück. Bei XML-Syntaxfehlern enthält es ein <parsererror>-Element.Beispiele
HTML-String parsen und Daten auslesen
const parser = new DOMParser();
const html = `
<ul id="produkte">
<li data-preis="19.90">Tastatur</li>
<li data-preis="49.00">Maus</li>
</ul>`;
const doc = parser.parseFromString(html, 'text/html');
const produkte = [...doc.querySelectorAll('#produkte li')].map((li) => ({
name: li.textContent.trim(),
preis: Number(li.dataset.preis)
}));
console.log(produkte);
RSS-Feed per fetch laden und als XML auswerten
const ladeFeed = async (url) => {
const antwort = await fetch(url);
const text = await antwort.text();
const xml = new DOMParser().parseFromString(text, 'application/xml');
return [...xml.querySelectorAll('item')].map((item) => ({
titel: item.querySelector('title')?.textContent ?? '',
link: item.querySelector('link')?.textContent ?? ''
}));
};
ladeFeed('/feed.xml').then((eintraege) => console.table(eintraege));
XML-Parserfehler erkennen
const parseXml = (text) => {
const doc = new DOMParser().parseFromString(text, 'application/xml');
const fehler = doc.querySelector('parsererror');
if (fehler) {
throw new SyntaxError(`Ungültiges XML: ${fehler.textContent.trim().split('\n')[0]}`);
}
return doc;
};
try {
parseXml('<config><wert>1</config>');
} catch (e) {
console.error(e.name);
}
SVG-Markup parsen und ins Dokument einfügen
const svgText = '<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40"><circle cx="20" cy="20" r="18" fill="tomato"/></svg>';
const svgDoc = new DOMParser().parseFromString(svgText, 'image/svg+xml');
const svg = document.importNode(svgDoc.documentElement, true);
document.body.append(svg);
console.log(svg instanceof SVGSVGElement);
// Wichtig · Fallstricke
- Keine Ausnahme bei XML-Fehlern: Prüfe immer auf ein
<parsererror>-Element. Wie es genau aufgebaut ist, unterscheidet sich zwischen den Browsern (in Firefox ist es z. B. das Wurzelelement), deshalb am besten perquerySelector('parsererror')suchen. - Kein Schutz vor XSS: Beim Parsen werden
<script>-Elemente zwar nicht ausgeführt, fügst du die Knoten aber später ins sichtbare Dokument ein, laufen Event-Handler-Attribute wieonerroroderjavascript:-URLs trotzdem. Nicht vertrauenswürdiges HTML vorher bereinigen (z. B. mit DOMPurify oder der Sanitizer-API) und bevorzugttextContentstatt Markup übernehmen. - Trusted Types / CSP: Mit
require-trusted-types-for 'script'akzeptiertparseFromString(…, 'text/html')nur nochTrustedHTML. - HTML-Fragmente werden in ein vollständiges Dokument mit
<html>,<head>und<body>gepackt. Elemente wie<tr>ohne<table>werden dabei verworfen. Für Fragmente ist oft<template>oderRange.createContextualFragment()besser geeignet. - Bei XML-Dokumenten mit Namensräumen (z. B. Atom) ggf.
getElementsByTagNameNS()verwenden. Groß-/Kleinschreibung spielt im XML-Modus eine Rolle. - Die Rückrichtung (DOM → String) übernimmt
XMLSerializer. In Node.js gibt esDOMParsernicht von Haus aus; dort helfen Bibliotheken wiejsdomoderlinkedom.