Signatur
Beschreibung
getAttributeNS() liest ein Attribut anhand von Namespace-URI und lokalem Namen aus, statt anhand des qualifizierten Namens (z. B. xlink:href). So wird das Attribut unabhängig vom Präfix gefunden, das im Dokument tatsächlich verwendet wird: Ob dort xlink:href oder xl:href steht, spielt keine Rolle, solange der Namespace-URI stimmt.
Gebraucht wird die Methode vor allem bei XML-Dokumenten (z. B. aus DOMParser oder XMLHttpRequest.responseXML), bei SVG mit älteren xlink:-Attributen und bei MathML oder eigenen XML-Vokabularen, in denen Attribute aus verschiedenen Namespaces vorkommen.
Wichtig: Normale Attribute ohne Präfix, etwa class, id oder width auf einem SVG-Element, haben keinen Namespace. Man übergibt dann null (oder "") als ersten Parameter und nicht den SVG-Namespace. Für reine HTML-Attribute ist getAttribute() einfacher und völlig ausreichend.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $namespace Pflicht | string | null | Namespace-URI des gesuchten Attributs, z. B. "http://www.w3.org/1999/xlink". null oder "" steht für Attribute ohne Namespace. |
|
| $localName Pflicht | string | Lokaler Name des Attributs ohne Präfix, z. B. "href" statt "xlink:href". Groß-/Kleinschreibung wird beachtet. |
Rückgabewert
null, wenn am Element kein passendes Attribut existiert. Ein vorhandenes, aber leeres Attribut liefert "".Beispiele
xlink:href eines SVG-<use>-Elements auslesen
const XLINK_NS = 'http://www.w3.org/1999/xlink';
const SVG_NS = 'http://www.w3.org/2000/svg';
const use = document.createElementNS(SVG_NS, 'use');
use.setAttributeNS(XLINK_NS, 'xlink:href', '#icon-star');
// Nur der lokale Name ohne Präfix wird übergeben
console.log(use.getAttributeNS(XLINK_NS, 'href'));
// Mit falschem Namespace gibt es keinen Treffer
console.log(use.getAttributeNS(null, 'href'));
Namespaced-Attribute in einem geparsten XML-Dokument
const xml = `<katalog xmlns:p="urn:example:preise">
<artikel id="a1" p:waehrung="EUR" p:betrag="19.99">Buch</artikel>
</katalog>`;
const doc = new DOMParser().parseFromString(xml, 'application/xml');
const artikel = doc.querySelector('artikel');
const NS = 'urn:example:preise';
const betrag = Number(artikel.getAttributeNS(NS, 'betrag'));
const waehrung = artikel.getAttributeNS(NS, 'waehrung');
// Attribut ohne Präfix -> kein Namespace -> null
const id = artikel.getAttributeNS(null, 'id');
console.log(`${id}: ${betrag.toFixed(2)} ${waehrung}`);
Präfix-unabhängige Abfrage mit Rückfallwert
const doc = new DOMParser().parseFromString(
'<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink">' +
'<a xl:href="https://example.com" xl:title="Beispiel"/></svg>',
'image/svg+xml'
);
const link = doc.querySelector('a');
const XLINK_NS = 'http://www.w3.org/1999/xlink';
// Das Präfix ist hier "xl", nicht "xlink" – trotzdem ein Treffer
const href = link.getAttributeNS(XLINK_NS, 'href') ?? '#';
const ziel = link.getAttributeNS(XLINK_NS, 'show') ?? 'replace';
console.log(href, ziel);
console.log(link.getAttribute('xlink:href')); // qualifizierter Name passt nicht
// Wichtig · Fallstricke
- Kein Präfix übergeben:
getAttributeNS(ns, 'xlink:href')findet nichts. Der zweite Parameter ist immer der lokale Name, also'href'. - Attribute ohne Präfix haben keinen Namespace: Auch auf SVG-Elementen gilt für
width,classusw.getAttributeNS(null, 'width'). Mit dem SVG-Namespace ist das Ergebnisnull. nullstatt"": Laut aktueller DOM-Spezifikation ist der Rückgabewertnull, wenn das Attribut fehlt. Sehr alte Browser haben teilweise""geliefert. Wer sicher prüfen will, ob ein Attribut existiert, nimmthasAttributeNS().- Groß-/Kleinschreibung: Anders als
getAttribute()bei HTML-Elementen wandeltgetAttributeNS()den Namen nicht in Kleinbuchstaben um. - xlink ist veraltet: SVG 2 unterstützt einfaches
hrefohne Namespace, und alle modernen Browser verstehen es. Für Kompatibilität lohnt es sich, beides zu prüfen:el.getAttribute('href') ?? el.getAttributeNS(XLINK_NS, 'href'). - Browser-Unterstützung: Die Methode steht in allen gängigen Browsern seit vielen Jahren zur Verfügung. In Node.js gibt es sie nur über DOM-Implementierungen wie
jsdom.