Exemplo n.º 1
0
        public static bool ChangeNameSpaceAlias(string inputFileXML, string outputFileXML, List <NamespaceDoc> namespaceDocs)
        {
            NamespaceUriAliasList currentDocListOfNSAlias = new NamespaceUriAliasList();

            try
            {
                if (String.IsNullOrEmpty(inputFileXML) || !File.Exists(inputFileXML))
                {
                    throw new Exception(String.Format("Missing input file: '{0}'", String.IsNullOrEmpty(inputFileXML) ? "[none]" : inputFileXML));
                }
                if (!String.IsNullOrEmpty(outputFileXML) && File.Exists(outputFileXML))
                {
                    throw new Exception(String.Format("Output file exists: '{0}'", outputFileXML));
                }

                //Validate input
                XDocument xDoc = XDocument.Load(inputFileXML);

                //find root namespace
                if (namespaceDocs.Exists(a => a.RootNamespace == xDoc.Document.Root.Name.Namespace.NamespaceName))
                {
                    currentDocListOfNSAlias = namespaceDocs.Find(a => a.RootNamespace == xDoc.Document.Root.Name.Namespace.NamespaceName).Namespaces;
                }

                if (currentDocListOfNSAlias == null || currentDocListOfNSAlias.Count == 0)
                {
                    //No changes to do, return output as input
                    File.Copy(inputFileXML, outputFileXML);
                    return(true);
                }

                //Include any missing namespace uri in file
                //First all with names
                var allNamespaces = xDoc.Descendants().Attributes().Where(x => x.IsNamespaceDeclaration && x.Name.LocalName != "xmlns" && !String.IsNullOrEmpty(x.Name.LocalName));
                foreach (var ns in allNamespaces)
                {
                    if (!currentDocListOfNSAlias.Exists(x => x.Uri == ns.Value))
                    {
                        currentDocListOfNSAlias.Add(new NamespaceUriAlias()
                        {
                            Alias = ns.Name.LocalName, Uri = ns.Value
                        });
                    }
                }

                //then all without names
                allNamespaces = xDoc.Descendants().Attributes().Where(x => x.IsNamespaceDeclaration && x.Name.LocalName != "xmlns");
                foreach (var ns in allNamespaces)
                {
                    if (!currentDocListOfNSAlias.Exists(x => x.Uri == ns.Value))
                    {
                        currentDocListOfNSAlias.Add(new NamespaceUriAlias()
                        {
                            Alias = ns.Name.LocalName, Uri = ns.Value
                        });
                    }
                }

                //Ensure unique non blank namespace uris
                NamespaceUriAliasList tmpListOfNSAlias = new NamespaceUriAliasList();
                foreach (var ns in currentDocListOfNSAlias.FindAll(x => !String.IsNullOrEmpty(x.Uri)))
                {
                    if (!tmpListOfNSAlias.Exists(x => x.Uri == ns.Uri))
                    {
                        tmpListOfNSAlias.Add(new NamespaceUriAlias()
                        {
                            Alias = ns.Alias, Uri = ns.Uri
                        });
                    }
                }
                currentDocListOfNSAlias = tmpListOfNSAlias;

                //Remove all namespacedeclarations
                xDoc.Descendants().Attributes().Where(x => x.IsNamespaceDeclaration).Remove();

                //Resolve common alias when alias = ""
                foreach (var nsAlias in currentDocListOfNSAlias)
                {
                    if (!String.IsNullOrEmpty(nsAlias.Alias))
                    {
                        continue;
                    }
                    if (nsAlias.Uri == "http://www.w3.org/2001/XMLSchema")
                    {
                        nsAlias.Alias = "xsd";
                    }
                    else if (nsAlias.Uri == "http://www.w3.org/2001/XMLSchema-instance")
                    {
                        nsAlias.Alias = "xsi";
                    }
                }

                //Set counter alias on duplicate aliases, only set counter alias from the secound in list (keep alias on the first occurence)
                string currItem = null;
                int    counter  = 0;
                foreach (var dupitem in currentDocListOfNSAlias.OrderBy(o => o.Alias))
                {
                    if (currItem == null || dupitem.Alias != currItem)
                    {
                        currItem = dupitem.Alias;
                    }
                    else
                    {
                        //number 2 of alias
                        counter++;
                        string newAlias = "ns" + counter.ToString();
                        while (currentDocListOfNSAlias.Exists(x => x.Alias == newAlias))
                        {
                            newAlias = "ns" + (counter++).ToString();
                        }
                        dupitem.Alias = newAlias;
                    }
                }

                //Load namespaces to root, start with the default if it exists, and procees in alias alphabetical order
                foreach (var nsAlias in currentDocListOfNSAlias.FindAll(x => String.IsNullOrEmpty(x.Alias)))
                {
                    xDoc.Root.Add(new XAttribute("xmlns", nsAlias.Uri));
                }

                foreach (var nsAlias in currentDocListOfNSAlias.FindAll(x => !String.IsNullOrEmpty(x.Alias)).OrderBy(o => o.Alias.ToLower()))
                {
                    xDoc.Root.Add(new XAttribute(XNamespace.Xmlns + nsAlias.Alias, nsAlias.Uri));
                }

                //Save output file
                xDoc.Save(outputFileXML);

                return(true);
            }
            catch
            {
                throw;
            }
        }
 public NamespaceDoc()
 {
     Namespaces = new NamespaceUriAliasList();
 }