Das Problem ist bekannt: Man hat verschiedene XML-Dokumente vorliegen und möchte mit XPath darauf zugreifen. Nur wo bekomme ich den XmlNamespaceManager her?
Die Lösung ist einfach und schnell: man liest ihn aus den Dokumenten selbst aus.
Denn ein Standard XML Dokument hat alle benötigten Informationen schon enthalten! Hier ein Auszug aus einer InfoPath XML Datei als Beispiel:
<?xml version="1.0" encoding="UTF-8"?>
<?mso-infoPathSolution solutionVersion="…" productVersion="…" PIVersion="…" href="…" ?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>
<my:meineFelder
xmlns:my=http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-09-03T12:35:53
xml:lang="en-us"></my:meineFelder>
Man kann direkt sehen, dass dort in der vorletzten Zeile die Namespace Informationen enthalten sind. Um an diese heranzukommen bedarf es nicht viel Code:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(content);
XPathNavigator navigator = xmlDoc.CreateNavigator();
navigator.MoveToFollowing(XPathNodeType.Element);
XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
foreach (KeyValuePair<string, string> ns in navigator.GetNamespacesInScope(XmlNamespaceScope.All))
{
nsManager.AddNamespace(ns.Key, ns.Value);
}
Mit diesem kleinem Code-Stück wird das XML-Dokument eingelesen, dann wird einer Navigator dafür erstellt. Der Navigator wird auf das erste Element weitergeschaltet, aus dem dann die gesamten Namespace Informationen ausgelesen werden.