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? 🙂