Signatur
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
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);
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);
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());
}
// Wichtig · Fallstricke
- Schreibgeschützt: Wer
resultTypeetwas zuweist, bewirkt nichts (im Strict Mode wird einTypeErrorausgelöst). Den Typ legt man ausschließlich über das vierte Argument vondocument.evaluate()fest. - Falsche Zugriffsmethode: Wer z. B.
numberValuebei einem Knoten-Iterator odersnapshotItem()bei einem Iterator-Typ aufruft, bekommt einenTypeError. Deshalb vorherresultTypeprüfen. - Vergleiche immer mit den benannten Konstanten (
XPathResult.STRING_TYPE) statt mit festen Zahlen – so bleibt der Code lesbar. - Bei
ANY_TYPEliefern Knotenmengen im Browser in der PraxisUNORDERED_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.