Start · Sprachen · JavaScript · Referenz · Node.lookupNamespaceURI()

Node.lookupNamespaceURI()

Methode

Gibt die Namespace-URI zurück, die auf dem Knoten mit dem angegebenen Präfix verknüpft ist, oder <code>null</code>, wenn keine gefunden wird.

seit JavaScript DOM Level 3 · Baseline: alle Browser Kategorie: webapi

Signatur

Node.prototype.lookupNamespaceURI(prefix)

Beschreibung

lookupNamespaceURI() löst ein Namespace-Präfix, z. B. "svg" oder "xlink", im Kontext eines bestimmten Knotens auf. Die Methode prüft zuerst den Namespace und das Präfix des Elements selbst und danach dessen xmlns:präfix-Attribute. Wird dort nichts gefunden, sucht sie der Reihe nach bei den Elternelementen weiter. So erhältst du genau die Namespace-Deklaration, die an dieser Stelle im Dokument gilt.

Übergibst du null oder einen leeren String, liefert die Methode den Standard-Namespace (Default Namespace) des Knotens. Das ist die URI, die über ein einfaches xmlns="…" festgelegt ist oder zum Element selbst gehört, wenn es kein Präfix hat. In HTML-Dokumenten ist das bei normalen Elementen http://www.w3.org/1999/xhtml und bei eingebettetem SVG http://www.w3.org/2000/svg.

Wie gesucht wird, hängt vom Knotentyp ab:

  • Element: Das Element selbst und dann seine Vorfahren werden durchsucht.
  • Document: Die Suche wird an documentElement weitergegeben. Hat das Dokument kein Wurzelelement, ist das Ergebnis null.
  • Attr: Die Suche wird an das ownerElement weitergegeben.
  • Text, Kommentar und ähnliche Knoten: Die Suche startet beim Elternelement.
  • DocumentType und DocumentFragment: Das Ergebnis ist immer null.

In der Praxis brauchst du die Methode vor allem bei XML-Dokumenten wie RSS/Atom, SOAP, SVG oder XHTML. Typische Fälle sind getElementsByTagNameNS(), createElementNS() und XPath-Namespace-Resolver mit document.evaluate(), die eine Präfix-zu-URI-Zuordnung brauchen.

Parameter

Name Typ Default Beschreibung
$prefix Pflicht string | null Das Präfix, das aufgelöst werden soll, ohne Doppelpunkt, z. B. "atom". null oder "" fragt den Standard-Namespace ab. Der Parameter ist Pflicht: Rufst du die Methode ohne Argument auf, wird das in "undefined" umgewandelt und als Präfix gesucht.

Rückgabewert

Typ
string | null
Beschreibung
Die Namespace-URI, die für das Präfix an diesem Knoten gilt, oder null, wenn das Präfix hier nicht deklariert ist. Ist ein Präfix ausdrücklich mit einem leeren Wert deklariert (xmlns=""), ist das Ergebnis ebenfalls null.

Beispiele

Präfixe in einem Atom-Feed auflösen

const xml = `<feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:media="http://search.yahoo.com/mrss/">
  <entry>
    <title>Hallo Welt</title>
    <media:thumbnail url="bild.jpg"/>
  </entry>
</feed>`;

const doc = new DOMParser().parseFromString(xml, 'application/xml');
const entry = doc.querySelector('entry');

console.log(entry.lookupNamespaceURI('media'));   // von <feed> geerbt
console.log(entry.lookupNamespaceURI(null));      // Standard-Namespace
console.log(entry.lookupNamespaceURI('dc'));      // nicht deklariert
http://search.yahoo.com/mrss/ http://www.w3.org/2005/Atom null

Standard-Namespace in HTML und eingebettetem SVG

document.body.innerHTML = '<div id="box"><svg id="icon"><circle r="5"/></svg></div>';

const div = document.getElementById('box');
const circle = document.querySelector('#icon circle');

console.log(div.lookupNamespaceURI(null));
console.log(circle.lookupNamespaceURI(null));
console.log(document.lookupNamespaceURI(null)); // wird an <html> weitergegeben
http://www.w3.org/1999/xhtml http://www.w3.org/2000/svg http://www.w3.org/1999/xhtml

Namespace-Resolver für XPath

const xml = `<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body><status>ok</status></soap:Body>
</soap:Envelope>`;

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

// Präfixe im XPath-Ausdruck über die Deklarationen im Dokument auflösen
const resolver = (prefix) => doc.documentElement.lookupNamespaceURI(prefix);

const result = doc.evaluate(
  '/soap:Envelope/soap:Body/status',
  doc,
  resolver,
  XPathResult.STRING_TYPE,
  null
);

console.log(result.stringValue);
ok

Vordefinierte Präfixe xml und xmlns

const doc = new DOMParser().parseFromString('<root/>', 'application/xml');
const root = doc.documentElement;

console.log(root.lookupNamespaceURI('xml'));
console.log(root.lookupNamespaceURI('xmlns'));
http://www.w3.org/XML/1998/namespace http://www.w3.org/2000/xmlns/

// Wichtig · Fallstricke

  • Präfixe sind in HTML-Dokumenten eingeschränkt: Der HTML-Parser erzeugt keine allgemeinen Namespace-Präfixe. Ein Element wie <foo:bar> ist in HTML ein normales HTML-Element mit dem lokalen Namen foo:bar. Für eigene Präfixe musst du das Dokument deshalb als XML parsen, zum Beispiel mit DOMParser und 'application/xml', oder mit createElementNS()/setAttributeNS() arbeiten.
  • Nur Deklarationen werden ausgewertet: Die Methode liest die Namespace-Informationen aus dem Baum. Ob ein Präfix im Dokument tatsächlich benutzt wird, spielt keine Rolle. Nachträglich per setAttribute('xmlns:x', …) gesetzte Attribute können zu überraschenden Ergebnissen führen. Verwende stattdessen setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:x', uri).
  • null und "" bedeuten dasselbe: Beide fragen den Standard-Namespace ab. Rufst du die Methode dagegen ohne Argument auf, wird der String \"undefined\" gesucht.
  • Nicht verbundene Knoten: Bei DocumentFragment, DocumentType und einem Dokument ohne Wurzelelement ist das Ergebnis immer null.
  • Umgekehrte Richtung: lookupPrefix() ermittelt das Präfix zu einer URI. isDefaultNamespace() prüft, ob eine URI der Standard-Namespace ist.
  • Kompatibilität: Die Methode wird von allen modernen Browsern unterstützt und ist Teil des DOM Living Standard. In Node.js gibt es sie nur über DOM-Implementierungen wie jsdom.