Start · Sprachen · JavaScript · Referenz · XPathResult.resultType

XPathResult.resultType

Eigenschaft

Schreibgeschützte Eigenschaft, die als Zahl angibt, welchen Ergebnistyp ein <code>XPathResult</code> hat (z. B. <code>NUMBER_TYPE</code> oder <code>ORDERED_NODE_SNAPSHOT_TYPE</code>).

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

XPathResult.resultType

Beschreibung

Die Eigenschaft resultType eines XPathResult-Objekts gibt an, in welcher Form das Ergebnis eines Aufrufs von document.evaluate() vorliegt. Der Wert ist eine Ganzzahl, die einer der Konstanten von XPathResult entspricht, etwa XPathResult.STRING_TYPE (2) oder XPathResult.UNORDERED_NODE_ITERATOR_TYPE (4).

Besonders wichtig ist die Eigenschaft, wenn man document.evaluate() mit XPathResult.ANY_TYPE (0) aufruft. Dann wählt der Browser den Typ passend zum Ausdruck selbst: Zahlen-, Text- und Wahrheitswert-Ausdrücke liefern NUMBER_TYPE, STRING_TYPE oder BOOLEAN_TYPE, Knotenmengen liefern in der Regel UNORDERED_NODE_ITERATOR_TYPE. Über resultType findet man heraus, auf welche Zugriffsmethode man zugreifen darf.

Die möglichen Werte sind:

  • ANY_TYPE (0), NUMBER_TYPE (1), STRING_TYPE (2), BOOLEAN_TYPE (3)
  • UNORDERED_NODE_ITERATOR_TYPE (4), ORDERED_NODE_ITERATOR_TYPE (5)
  • UNORDERED_NODE_SNAPSHOT_TYPE (6), ORDERED_NODE_SNAPSHOT_TYPE (7)
  • ANY_UNORDERED_NODE_TYPE (8), FIRST_ORDERED_NODE_TYPE (9)

Je nach Typ ist nur eine bestimmte Zugriffsart erlaubt: numberValue, stringValue, booleanValue, iterateNext(), snapshotItem()/snapshotLength oder singleNodeValue.

Rückgabewert

Typ
number
Beschreibung
Eine Ganzzahl von 0 bis 9, die einer der Typkonstanten von XPathResult entspricht. Nach einer Auswertung mit ANY_TYPE ist der Wert nie 0, sondern der tatsächlich gewählte Typ.

Beispiele

Ermittelten Typ bei ANY_TYPE prüfen

// Zählt alle Absätze im Dokument
const result = document.evaluate(
  'count(//p)',
  document,
  null,
  XPathResult.ANY_TYPE,
  null
);

console.log(result.resultType); // 1
console.log(result.resultType === XPathResult.NUMBER_TYPE); // true
console.log(result.numberValue);
1 true 3 (je nach Anzahl der <p>-Elemente)

Allgemeine Hilfsfunktion, die jedes Ergebnis auswertet

const readXPath = (expr, context = document) => {
  const r = document.evaluate(expr, context, null, XPathResult.ANY_TYPE, null);

  switch (r.resultType) {
    case XPathResult.NUMBER_TYPE:
      return r.numberValue;
    case XPathResult.STRING_TYPE:
      return r.stringValue;
    case XPathResult.BOOLEAN_TYPE:
      return r.booleanValue;
    case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
    case XPathResult.ORDERED_NODE_ITERATOR_TYPE: {
      const nodes = [];
      let node;
      while ((node = r.iterateNext())) nodes.push(node);
      return nodes;
    }
    default:
      throw new Error(`Unerwarteter Ergebnistyp: ${r.resultType}`);
  }
};

console.log(readXPath('string(//title)'));
console.log(readXPath('boolean(//nav)'));
console.log(readXPath('//a[@href]').length);
Titel der Seite true 12 (je nach Seite)

Explizit angeforderter Typ wird übernommen

const snap = document.evaluate(
  '//li',
  document,
  null,
  XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
  null
);

console.log(snap.resultType); // 7
for (let i = 0; i < snap.snapshotLength; i++) {
  console.log(snap.snapshotItem(i).textContent.trim());
}
7 (Text jedes <li>-Elements)

// Wichtig · Fallstricke

  • Schreibgeschützt: Wer resultType etwas zuweist, bewirkt nichts (im Strict Mode wird ein TypeError ausgelöst). Den Typ legt man ausschließlich über das vierte Argument von document.evaluate() fest.
  • Falsche Zugriffsmethode: Wer z. B. numberValue bei einem Knoten-Iterator oder snapshotItem() bei einem Iterator-Typ aufruft, bekommt einen TypeError. Deshalb vorher resultType prüfen.
  • Vergleiche immer mit den benannten Konstanten (XPathResult.STRING_TYPE) statt mit festen Zahlen – so bleibt der Code lesbar.
  • Bei ANY_TYPE liefern Knotenmengen im Browser in der Praxis UNORDERED_NODE_ITERATOR_TYPE. Iteratoren werden ungültig, sobald sich das DOM ändert (invalidIteratorState). Bei DOM-Änderungen besser einen Snapshot-Typ anfordern.
  • Kompatibilität: wird von allen modernen Browsern unterstützt. In Node.js gibt es das nicht nativ, nur über Bibliotheken wie jsdom.