Start · Sprachen · JavaScript · Referenz · XPathResult.stringValue

XPathResult.stringValue

Eigenschaft

Schreibgeschützte Eigenschaft, die den Zeichenkettenwert eines XPath-Ergebnisses liefert, wenn <code>resultType</code> gleich <code>STRING_TYPE</code> ist.

seit JavaScript Baseline: alle Browser (DOM Level 3 XPath) Kategorie: webapi

Signatur

XPathResult.stringValue

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

Typ
string
Beschreibung
Der Zeichenkettenwert des XPath-Ergebnisses. Gibt es keinen passenden Knoten, ist er eine leere Zeichenkette "". 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);
true Meine Beispielseite

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);
978-1-4028-9462-6

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);
}
Hallo Welt Ausdruck liefert keinen String (Typ 1)

// Wichtig · Fallstricke

  • TypeError bei falschem Typ: Wird stringValue gelesen, obwohl resultType nicht STRING_TYPE ist (z. B. bei ANY_TYPE und einem Ausdruck wie //p, der eine Knotenmenge liefert), wirft der Browser einen TypeError. Deshalb entweder STRING_TYPE ausdrücklich anfordern oder vorher resultType prüfen.
  • Nur der erste Knoten: Bei einer Knotenmenge zählt nur der erste Treffer in Dokumentreihenfolge. Alle Treffer bekommt man über ORDERED_NODE_SNAPSHOT_TYPE und snapshotItem().
  • Kein Treffer: Ein leeres Ergebnis ergibt "", nicht null. Ob ein Knoten fehlt oder leer ist, lässt sich so nicht unterscheiden; im Zweifel mit boolean(...) 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.evaluate nicht. In Node.js gibt es die Eigenschaft nur mit DOM-Implementierungen wie jsdom.