Signatur
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
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);
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);
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);
// 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ürDocument.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()einenNAMESPACE_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 wiejsdomoderxpath.