Самый простой способ, который я когда-либо нашел для получения всех пространств имен из данного XmlDocument, - это XPath через все узлы, находящие уникальные значения Prefix и NamespaceURI.
У меня есть вспомогательная процедура, которую я использую для возврата этих уникальных значений в XmlNamespaceManager, чтобы упростить жизнь, когда я имею дело со сложными документами Xml.
Код выглядит следующим образом:
private static XmlNamespaceManager PrepopulateNamespaces( XmlDocument document )
{
XmlNamespaceManager result = new XmlNamespaceManager( document.NameTable );
var namespaces = ( from XmlNode n in document.SelectNodes( "//*|@*" )
where n.NamespaceURI != string.Empty
select new
{
Prefix = n.Prefix,
Namespace = n.NamespaceURI
} ).Distinct();
foreach ( var item in namespaces )
result.AddNamespace( item.Prefix, item.Namespace );
return result;
}