Start · Sprachen · JavaScript · Referenz · XPathEvaluator.createNSResolver()

XPathEvaluator.createNSResolver()

Methode

Veraltete Methode, die früher einen <code>XPathNSResolver</code> aus einem Knoten erzeugte. Heute gibt sie den übergebenen Knoten unverändert zurück.

seit JavaScript Baseline: alle Browser (Legacy – gibt heute nur no deprecated seit ja Kategorie: webapi

Signatur

XPathEvaluator.prototype.createNSResolver(nodeResolver)

Beschreibung

Mit createNSResolver() wurde früher aus einem DOM-Knoten ein XPathNSResolver gemacht. Das ist ein Objekt, das beim Auswerten eines XPath-Ausdrucks Namensraum-Präfixe wie dc: oder svg: in die passenden Namensraum-URIs übersetzt. Aufgelöst werden die Präfixe, die am übergebenen Knoten gültig sind, also die dort oder an einem Vorfahren mit xmlns:präfix="…" deklariert wurden.

Laut aktueller DOM-Spezifikation gibt die Methode ihr Argument unverändert zurück. Grund: Jeder Node hat selbst eine Methode lookupNamespaceURI() und kann deshalb direkt als Resolver an evaluate() übergeben werden. Die Methode gibt es nur noch, damit alter Code weiterläuft.

In neuem Code übergibst du an XPathEvaluator.evaluate() bzw. Document.evaluate() als Resolver am besten eines von beiden:

  • direkt einen Knoten, z. B. doc.documentElement, oder
  • eine eigene Funktion (prefix) => uri. Damit kannst du auch Standard-Namensräume ohne Präfix ansprechen, etwa bei Atom-Feeds oder XHTML.

Parameter

Name Typ Default Beschreibung
$nodeResolver Pflicht Node Knoten, dessen gültige Namensraum-Deklarationen zum Auflösen der Präfixe dienen, meist document.documentElement.

Rückgabewert

Typ
Node (XPathNSResolver)
Beschreibung
In aktuellen Browsern genau der übergebene Knoten nodeResolver. Ältere Implementierungen gaben ein eigenes Resolver-Objekt mit der Methode lookupNamespaceURI() zurück.

Beispiele

Klassische Verwendung mit Namensraum-Präfix (RSS mit Dublin Core)

const xml = `<rss xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel><item><dc:creator>Anna Schmidt</dc:creator></item></channel>
</rss>`;

const doc = new DOMParser().parseFromString(xml, "application/xml");
const evaluator = new XPathEvaluator();

// Resolver aus dem Wurzelelement erzeugen (Legacy-Stil)
const resolver = evaluator.createNSResolver(doc.documentElement);

const result = evaluator.evaluate(
  "//dc:creator",
  doc,
  resolver,
  XPathResult.STRING_TYPE,
  null
);

console.log(result.stringValue);
Anna Schmidt

Die Methode gibt nur ihr Argument zurück

const doc = new DOMParser().parseFromString(
  '<root xmlns:x="urn:beispiel"/>',
  "application/xml"
);
const evaluator = new XPathEvaluator();
const resolver = evaluator.createNSResolver(doc.documentElement);

console.log(resolver === doc.documentElement);
console.log(resolver.lookupNamespaceURI("x"));

// Modern: Knoten direkt übergeben, ohne createNSResolver()
const count = doc.evaluate("count(/root)", doc, doc.documentElement, XPathResult.NUMBER_TYPE, null);
console.log(count.numberValue);
true urn:beispiel 1

Moderner Ersatz: Resolver-Funktion für Standard-Namensräume (Atom-Feed)

const xml = `<feed xmlns="http://www.w3.org/2005/Atom">
  <entry><title>Hallo Welt</title></entry>
</feed>`;

const doc = new DOMParser().parseFromString(xml, "application/xml");

// Einen Standard-Namensraum (ohne Präfix) kann ein Knoten-Resolver nicht abbilden,
// deshalb ein eigenes Präfix festlegen
const namespaces = { atom: "http://www.w3.org/2005/Atom" };
const resolver = (prefix) => namespaces[prefix] ?? null;

const node = doc.evaluate(
  "//atom:entry/atom:title",
  doc,
  resolver,
  XPathResult.FIRST_ORDERED_NODE_TYPE,
  null
).singleNodeValue;

console.log(node?.textContent);
Hallo Welt

// Wichtig · Fallstricke

  • Veraltet: Die Methode gibt nur noch den übergebenen Knoten zurück. Schreib neuen Code ohne sie und übergib den Knoten oder eine Resolver-Funktion direkt an evaluate(). Das Gleiche gilt für Document.createNSResolver().
  • Standard-Namensraum: Ein Knoten-Resolver kann Präfixe nur über die Deklarationen im XML auflösen. Elemente in einem Standard-Namensraum (xmlns="…") lassen sich damit per XPath nicht treffen. Du brauchst eine eigene Funktion, die ein selbst gewähltes Präfix auf die URI abbildet.
  • Gültigkeitsbereich: Aufgelöst werden nur Präfixe, die am übergebenen Knoten gelten. Deklarationen tiefer im Baum kennt der Resolver nicht. Wählst du einen falschen Knoten, wirft evaluate() einen NAMESPACE_ERR.
  • HTML-Dokumente: In text/html-Dokumenten brauchen HTML-Elemente bei XPath meist kein Präfix. Ein Resolver ist nur bei eingebettetem SVG/MathML oder bei echtem XML nötig.
  • Kompatibilität: Die Methode gibt es in allen modernen Browsern. Node.js hat kein eingebautes XPathEvaluator, dafür brauchst du eine Bibliothek wie jsdom oder xpath.