Signatur
Beschreibung
Die schreibgeschützte Eigenschaft responseXML liefert den Antwortkörper einer XMLHttpRequest-Anfrage als fertig geparstes DOM-Document. Damit kann man die Antwort direkt mit DOM-Methoden wie querySelector(), getElementsByTagName() oder evaluate() (XPath) auswerten, ohne selbst einen DOMParser zu benutzen.
Der Wert ist null, wenn die Anfrage noch nicht abgeschlossen ist (readyState ungleich 4), wenn sie fehlgeschlagen ist oder wenn sich die Antwort nicht als XML bzw. HTML parsen lässt. Ob der Browser XML parst, hängt vom Content-Type der Antwort ab (z. B. text/xml, application/xml, application/rss+xml oder …+xml). Passt der Server-Header nicht, lässt er sich vor dem Senden mit overrideMimeType('text/xml') überschreiben.
Ein HTML-Dokument bekommt man nur, wenn vor send() responseType = 'document' gesetzt wird; bei synchronen Anfragen oder leerem responseType wird HTML nicht geparst. Ist responseType weder '' noch 'document', wirft der Zugriff auf responseXML einen InvalidStateError.
Man nutzt responseXML vor allem in älterem Code oder beim Anbinden von XML-Schnittstellen wie RSS/Atom-Feeds, SOAP-Diensten oder Sitemaps. In neuem Code wird meist fetch() mit response.text() und DOMParser verwendet.
Rückgabewert
XMLDocument bzw. Document mit der geparsten Antwort oder null, wenn die Anfrage nicht fertig, fehlerhaft oder nicht als XML/HTML parsebar ist.Beispiele
RSS-Feed laden und Titel auslesen
const xhr = new XMLHttpRequest();
xhr.open('GET', '/feed.xml');
xhr.addEventListener('load', () => {
const doc = xhr.responseXML;
if (xhr.status !== 200 || !doc) {
console.error('Kein gültiges XML erhalten');
return;
}
const titles = [...doc.querySelectorAll('item > title')]
.map((el) => el.textContent);
console.log(titles);
});
xhr.send();
Falschen Content-Type mit overrideMimeType korrigieren
// Server liefert XML fälschlich als text/plain
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/config');
xhr.overrideMimeType('text/xml');
xhr.onload = () => {
const doc = xhr.responseXML;
const timeout = doc?.querySelector('timeout')?.textContent;
console.log('Timeout:', Number(timeout));
};
xhr.send();
HTML-Seite als Document laden
const loadHtml = (url) => new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'document'; // nötig für HTML-Parsing
xhr.onload = () => xhr.responseXML
? resolve(xhr.responseXML)
: reject(new Error('Parsen fehlgeschlagen'));
xhr.onerror = () => reject(new Error('Netzwerkfehler'));
xhr.send();
});
const doc = await loadHtml('/impressum.html');
console.log(doc.title);
XML-Parserfehler erkennen
const xhr = new XMLHttpRequest();
xhr.open('GET', '/daten.xml');
xhr.onload = () => {
const doc = xhr.responseXML;
// Manche Browser liefern bei kaputtem XML null, andere ein Fehlerdokument
if (!doc || doc.querySelector('parsererror')) {
console.warn('XML ist fehlerhaft');
return;
}
console.log(doc.documentElement.nodeName);
};
xhr.send();
// Wichtig · Fallstricke
- Nur bei
responseType''oder'document': Bei anderen Werten (z. B.'json','blob') wirft der Zugriff einenInvalidStateError. - HTML nur asynchron und mit
responseType = 'document': Ohne diese Einstellung istresponseXMLbei HTML-Antwortennull. - MIME-Typ entscheidet: Liefert der Server kein XML-
Content-Type, ist der Wertnull. Abhilfe:overrideMimeType('text/xml')vorsend(). - Parserfehler: Bei ungültigem XML kommt je nach Browser
nulloder ein Dokument mit<parsererror>zurück. Am besten auf beides prüfen. - Web Worker: In Workern gibt es kein DOM, dort ist
responseXMLnicht verfügbar. StattdessenresponseTextverwenden. - Sicherheit: Geladene HTML-Dokumente sind inaktiv, Skripte darin werden nicht ausgeführt. Wer Knoten daraus per
importNode()oderinnerHTMLins eigene Dokument übernimmt, riskiert trotzdem XSS (z. B. überonerror-Attribute). Fremde Inhalte also vorher bereinigen. Für Anfragen an andere Ursprünge gelten die normalen CORS-Regeln. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Für neuen Code lieber
fetch()zusammen mitDOMParsernutzen.