Gets the XML namespace manager. : Namespace « XML « C# / C Sharp






Gets the XML namespace manager.

  
using System;
using System.Collections.Specialized;
using System.Xml;
using System.Text;
using System.Text.RegularExpressions;

namespace RSBuild
{
  /// <summary>
  /// Utility methods.
  /// </summary>
  public static class Util
  {

        /// <summary>
        /// Gets the XML namespace manager.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <returns>The XML namespace manager</returns>
    public static XmlNamespaceManager GetXmlNamespaceManager(XmlDocument input)
    {
      StringCollection namespaces = DetectXmlNamespace(input);
      XmlNamespaceManager xnm = null;
      
      if (namespaces != null && namespaces.Count > 0)
      {
        xnm = new XmlNamespaceManager(input.NameTable);
        foreach(string ns in namespaces) 
        {
          string[] arr = ns.Split('|');
          xnm.AddNamespace(arr[0].Trim(), arr[1].Trim());
        }
      }

      return xnm;
    }

        /// <summary>
        /// Detects the XML namespace.
        /// </summary>
        /// <param name="doc">The doc.</param>
        /// <returns></returns>
    private static StringCollection DetectXmlNamespace(XmlDocument doc) 
    {
      StringCollection detectedNamespaces = null;

      if (doc != null)
      {
        XmlNode xmlNode = doc.DocumentElement;
        detectedNamespaces = new StringCollection();
        DiscoverNamespace(xmlNode, detectedNamespaces);
      }

      return detectedNamespaces;
    }

        /// <summary>
        /// Discovers the namespace.
        /// </summary>
        /// <param name="xmlNode">The XML node.</param>
        /// <param name="discovered">The discovered.</param>
    private static void DiscoverNamespace(XmlNode xmlNode, StringCollection discovered)
    {
      string nsPrefix;
      string nsUri;

      if (xmlNode.NodeType == XmlNodeType.Element) 
      {
        if (xmlNode.Attributes.Count > 0) 
        {
          foreach(XmlAttribute attr in xmlNode.Attributes)
          {
            if (attr.Name.StartsWith("xmlns")) 
            {
              string nsDef = attr.Name.Split('=')[0];
              if (string.Compare(nsDef, "xmlns", true) != 0) 
              {
                nsPrefix = nsDef.Split(':')[1];
              }
              else 
              {
                nsPrefix = "def";
              }
              nsUri = attr.Value;

              discovered.Add(string.Format("{0}|{1}", nsPrefix, nsUri));
            }
          }
        }
        if (xmlNode.HasChildNodes) 
        {
          foreach(XmlNode node in xmlNode.ChildNodes)
          {
            DiscoverNamespace(node, discovered);
          }
        }
      }
    }
  }
}

   
    
  








Related examples in the same category

1.Get XML Nodes in a Specific XML Namespace