Signatur
Beschreibung
Die Eigenschaft snapshotLength gibt an, wie viele Knoten ein XPathResult vom Typ UNORDERED_NODE_SNAPSHOT_TYPE (6) oder ORDERED_NODE_SNAPSHOT_TYPE (7) enthält. Zusammen mit snapshotItem(index) kannst du so alle gefundenen Knoten mit einer normalen for-Schleife per Index durchlaufen.
Ein Snapshot ist eine statische Momentaufnahme: Die Knotenliste bleibt gleich, auch wenn sich das DOM danach ändert. Deshalb eignen sich Snapshots gut, wenn du die gefundenen Knoten während des Durchlaufens veränderst, verschiebst oder entfernst. Bei Iterator-Ergebnissen (*_ITERATOR_TYPE) wäre das nicht möglich, denn dort führt eine DOM-Änderung beim nächsten iterateNext() zu einem Fehler.
Typische Anwendungsfälle sind das Zählen von Treffern eines XPath-Ausdrucks, das Stapelweise Bearbeiten von Elementen (z. B. alle leeren Absätze entfernen) oder das Auswerten von XML-Dokumenten, die mit DOMParser geladen wurden.
Rückgabewert
unsigned long) mit der Anzahl der Knoten im Snapshot. 0, wenn der Ausdruck nichts gefunden hat.Beispiele
Treffer eines XPath-Ausdrucks zählen
const result = document.evaluate(
'//a[@href]',
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
console.log(`Gefundene Links: ${result.snapshotLength}`);
Alle Knoten per Index durchlaufen und das DOM verändern
// Leere Absätze entfernen – mit Snapshot sicher, da die Liste statisch bleibt
const leere = document.evaluate(
'//p[normalize-space(.) = ""]',
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null
);
for (let i = 0; i < leere.snapshotLength; i++) {
leere.snapshotItem(i).remove();
}
console.log(`${leere.snapshotLength} leere Absätze entfernt`);
Snapshot in ein Array umwandeln (XML aus DOMParser)
const xml = new DOMParser().parseFromString(
'<shop><artikel preis="5"/><artikel preis="12"/><artikel preis="30"/></shop>',
'application/xml'
);
const snap = xml.evaluate(
'//artikel[@preis > 10]',
xml,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
const teuer = Array.from({ length: snap.snapshotLength }, (_, i) => snap.snapshotItem(i));
console.log(teuer.map((el) => el.getAttribute('preis')));
// Wichtig · Fallstricke
- Nur bei Snapshot-Typen: Hat das Ergebnis einen anderen
resultType(z. B.ANY_TYPE,ORDERED_NODE_ITERATOR_TYPE,NUMBER_TYPE), wirft der Zugriff aufsnapshotLengtheinenTypeError(ältere Spezifikation:XPathExceptionmitTYPE_ERR). Gib daher beim Aufruf vondocument.evaluate()explizitORDERED_NODE_SNAPSHOT_TYPEbzw.UNORDERED_NODE_SNAPSHOT_TYPEan. - Statisch, nicht live: Der Wert ändert sich nicht, wenn Knoten nach der Auswertung ins DOM eingefügt oder daraus entfernt werden. Entfernte Knoten bleiben über
snapshotItem()weiterhin erreichbar. - Nur zum Zählen ist oft
count(...)mitNUMBER_TYPEeffizienter, da dann keine Knotenliste aufgebaut wird. - Bei Ergebnissen mit
UNORDERED_NODE_SNAPSHOT_TYPEist die Reihenfolge nicht garantiert dokumentgetreu. - Kompatibilität: Wird von allen modernen Browsern unterstützt. In Node.js gibt es die Eigenschaft nicht nativ, sondern nur über DOM-Implementierungen wie jsdom.