Start · Sprachen · JavaScript · Referenz · XPathResult.snapshotLength

XPathResult.snapshotLength

Eigenschaft

Schreibgeschützte Eigenschaft, die die Anzahl der Knoten in einem XPath-Ergebnis-Snapshot als Ganzzahl liefert.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

XPathResult.snapshotLength

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

Typ
number
Beschreibung
Eine nicht-negative Ganzzahl (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}`);
Gefundene Links: 12

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`);
3 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')));
["12", "30"]

// 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 auf snapshotLength einen TypeError (ältere Spezifikation: XPathException mit TYPE_ERR). Gib daher beim Aufruf von document.evaluate() explizit ORDERED_NODE_SNAPSHOT_TYPE bzw. UNORDERED_NODE_SNAPSHOT_TYPE an.
  • 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(...) mit NUMBER_TYPE effizienter, da dann keine Knotenliste aufgebaut wird.
  • Bei Ergebnissen mit UNORDERED_NODE_SNAPSHOT_TYPE ist 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.