Signatur
Beschreibung
serializeToString() ist die Methode eines XMLSerializer-Objekts. Sie nimmt einen DOM-Knoten entgegen und gibt ihn mit seinem ganzen Unterbaum als XML-Zeichenkette zurück. Das Gegenstück ist DOMParser.parseFromString(): Damit wird aus einer Zeichenkette wieder ein DOM.
Typische Anwendungsfälle:
- ein erzeugtes oder verändertes SVG exportieren, zum Beispiel als Download oder als Data-URL für ein
<img>oder<canvas>, - ein mit
DOMParseroderdocument.implementation.createDocument()erzeugtes XML-Dokument nach einer Änderung wieder als Text speichern oder perfetch()senden, - HTML-Elemente als wohlgeformtes XHTML ausgeben.
Die Ausgabe folgt den Regeln der XML-Serialisierung: Leere Elemente werden selbstschließend geschrieben (<br />), Sonderzeichen werden maskiert und Namensräume werden als xmlns-Attribute ergänzt, wenn sie nötig sind. Bei HTML-Elementen erscheint deshalb meist xmlns="http://www.w3.org/1999/xhtml". Wer HTML-Markup ohne diese Eigenheiten braucht, nimmt besser outerHTML oder innerHTML.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $rootNode Pflicht | Node | Der Knoten, der samt Unterbaum umgewandelt wird. Erlaubt sind zum Beispiel Document, Element, DocumentFragment, Text, Comment und Attr. Ist der Wert kein Node, wird ein TypeError ausgelöst. |
Rückgabewert
rootNode und allen Nachfahren.Beispiele
SVG-Element als Datei herunterladen
const svg = document.querySelector('svg');
const serializer = new XMLSerializer();
const svgText = serializer.serializeToString(svg);
const blob = new Blob([svgText], { type: 'image/svg+xml' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = 'grafik.svg';
link.click();
URL.revokeObjectURL(url);
XML parsen, ändern und wieder serialisieren
const xml = '<config><option name="theme">hell</option></config>';
const doc = new DOMParser().parseFromString(xml, 'application/xml');
doc.querySelector('option[name="theme"]').textContent = 'dunkel';
const neu = doc.createElement('option');
neu.setAttribute('name', 'lang');
neu.textContent = 'de & en';
doc.documentElement.append(neu);
console.log(new XMLSerializer().serializeToString(doc));
Unterschied zu outerHTML bei HTML-Elementen
const div = document.createElement('div');
div.innerHTML = 'Zeile 1<br>Zeile 2';
console.log(div.outerHTML);
console.log(new XMLSerializer().serializeToString(div));
SVG als Data-URL in ein Canvas zeichnen
const svgToImage = (svg) => new Promise((resolve, reject) => {
const text = new XMLSerializer().serializeToString(svg);
const img = new Image();
img.onload = () => resolve(img);
img.onerror = reject;
img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(text);
});
const img = await svgToImage(document.querySelector('svg'));
const ctx = document.querySelector('canvas').getContext('2d');
ctx.drawImage(img, 0, 0);
// Wichtig · Fallstricke
- Keine XML-Deklaration: Beim Umwandeln eines
Documentwird kein<?xml version="1.0"?>vorangestellt, sofern sie nicht als Knoten vorhanden ist. Bei Bedarf muss man sie selbst voranstellen. - Keine Formatierung: Es werden weder Einrückungen noch Zeilenumbrüche eingefügt. Vorhandener Leerraum bleibt so, wie er in den Textknoten steht.
- Nur DOM-Zustand: Umgewandelt wird nur das Markup. Berechnete CSS-Stile, externe Stylesheets, der aktuelle
valuevon Formularfeldern (sofern er nicht als Attribut gesetzt ist) und der Inhalt von Canvas-Elementen gehen verloren. Soll ein SVG außerhalb der Seite gleich aussehen, müssen die Stile inline im SVG stehen. - Namensräume: SVG-Elemente, die über
createElement()statt übercreateElementNS()erzeugt wurden, erhalten den XHTML-Namensraum und werden später nicht als SVG dargestellt. - Sicherheit: Das Ergebnis ist Markup. Stammt es aus fremden Quellen und wird es wieder per
innerHTMLoder als SVG-Bild eingefügt, besteht XSS-Gefahr, etwa durch Event-Handler-Attribute oder<script>in SVG. Solche Inhalte vorher bereinigen. - Kompatibilität: Wird von allen modernen Browsern seit Langem unterstützt. In Node.js fehlt die Methode nativ; dort stellen Bibliotheken wie
jsdomoder@xmldom/xmldomeinenXMLSerializerbereit.