Signatur
Beschreibung
Die Eigenschaft stringValue eines XPathResult-Objekts enthält das Ergebnis eines XPath-Ausdrucks als Zeichenkette. Sie ist nur lesbar und nur dann gültig, wenn der Ergebnistyp XPathResult.STRING_TYPE (Wert 2) ist. Diesen Typ erhält man, wenn man ihn bei document.evaluate() ausdrücklich anfordert oder wenn man ANY_TYPE übergibt und der Ausdruck selbst eine Zeichenkette liefert (z. B. string(), concat(), normalize-space()).
Fordert man STRING_TYPE ausdrücklich an, wandelt die XPath-Engine das Ergebnis nach den XPath-1.0-Regeln um: Bei einer Knotenmenge wird der Textinhalt des ersten Knotens in Dokumentreihenfolge genommen, Zahlen und Wahrheitswerte werden in ihre Textdarstellung umgewandelt ("true", "42", "NaN").
Das ist praktisch, um einzelne Werte wie einen Attributinhalt, einen Titel oder einen zusammengesetzten Text direkt aus HTML- oder XML-Dokumenten (etwa aus DOMParser oder einer XMLHttpRequest-Antwort) auszulesen, ohne erst über Knoten iterieren zu müssen.
Rückgabewert
"". Ist resultType nicht STRING_TYPE, wird beim Zugriff ein TypeError geworfen.Beispiele
Seitentitel per XPath auslesen
const result = document.evaluate(
'string(//title)',
document,
null,
XPathResult.STRING_TYPE,
null
);
console.log(result.resultType === XPathResult.STRING_TYPE); // true
console.log(result.stringValue);
Attributwert aus einem XML-Dokument ermitteln
const xml = `<katalog>
<buch isbn="978-3-16-148410-0"><titel>JavaScript lernen</titel></buch>
<buch isbn="978-1-4028-9462-6"><titel>XPath kompakt</titel></buch>
</katalog>`;
const doc = new DOMParser().parseFromString(xml, 'application/xml');
const isbn = doc.evaluate(
'//buch[titel="XPath kompakt"]/@isbn',
doc,
null,
XPathResult.STRING_TYPE,
null
).stringValue;
console.log(isbn);
Hilfsfunktion mit Fallback und ANY_TYPE-Prüfung
const xpathString = (expr, context = document) => {
const res = document.evaluate(expr, context, null, XPathResult.ANY_TYPE, null);
// Nur bei STRING_TYPE darf stringValue gelesen werden
if (res.resultType !== XPathResult.STRING_TYPE) {
throw new Error(`Ausdruck liefert keinen String (Typ ${res.resultType})`);
}
return res.stringValue;
};
console.log(xpathString('normalize-space(concat(" Hallo ", " Welt "))'));
try {
xpathString('count(//p)'); // liefert NUMBER_TYPE
} catch (e) {
console.log(e.message);
}
// Wichtig · Fallstricke
- TypeError bei falschem Typ: Wird
stringValuegelesen, obwohlresultTypenichtSTRING_TYPEist (z. B. beiANY_TYPEund einem Ausdruck wie//p, der eine Knotenmenge liefert), wirft der Browser einenTypeError. Deshalb entwederSTRING_TYPEausdrücklich anfordern oder vorherresultTypeprüfen. - Nur der erste Knoten: Bei einer Knotenmenge zählt nur der erste Treffer in Dokumentreihenfolge. Alle Treffer bekommt man über
ORDERED_NODE_SNAPSHOT_TYPEundsnapshotItem(). - Kein Treffer: Ein leeres Ergebnis ergibt
"", nichtnull. Ob ein Knoten fehlt oder leer ist, lässt sich so nicht unterscheiden; im Zweifel mitboolean(...)prüfen. - Namensräume: In XML-Dokumenten mit Standard-Namensraum (z. B. XHTML, SVG) passen Ausdrücke ohne Präfix nicht. Dafür muss ein
namespaceResolverübergeben werden. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Internet Explorer kannte
document.evaluatenicht. In Node.js gibt es die Eigenschaft nur mit DOM-Implementierungen wie jsdom.