C#: Verwendete XML-Namespaces aus XML-Dateien auslesen

Lange habe ich gesucht und doch keine Antwort auf die (meiner Meinung nach einfache) Frage gefunden, wie man mit C# alle in einer XML-Datei verwendeten XML-Namespaces auslesen kann. Damit meine ich eine simple Liste mit Präfixen und den diesen zugeordneten Namespaces, wie sie im Wurzelelement der XML-Datei definiert werden.

Es gibt zwar den XmlNamespaceManager, aber dem müssen die Namespaces einer Datei manuell hinzugefügt werden, die Präfixe und URIs müssen also bekannt sein. Er liest sie nicht automatisch aus Dateien aus (abgesehen von drei Standard-Namespaces, die immer vorhanden sind).

Da ich aber gerne aus vorhandenen Dateien die verwendeten Namespaces inkl. den ihnen zugewiesenen Präfixen auslesen möchte, habe ich die folgende Methode geschrieben, die mir eine Hashtable der Namespace-URIs mit ihren Präfixen als Keys liefert.

public static Hashtable GetXmlNamespaces(XmlDocument xmldoc) { Hashtable nse = new Hashtable(); foreach (XmlAttribute att in xmldoc.DocumentElement.Attributes) { if (att.Name.StartsWith("xmlns")) { // Default-Namespace? if (att.Name.IndexOf(":") == -1) { nse[string.Empty] = att.Value; } else { string nsname = att.Name.Substring(att.Name.IndexOf(":") + 1); nse[nsname] = att.Value; } } } return nse; }

Beispiel: nse["sm"] => “http://blog.stefan-macke.de

Weiß noch jemand eine einfachere Lösung? 🙂

Über Stefan

Polyglot Clean Code Developer

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax