Can ConfigurationManager retain XML comments on Save()?

后端 未结 3 1524
既然无缘
既然无缘 2020-12-14 16:21

I\'ve written a small utility that allows me to change a simple AppSetting for another application\'s App.config file, and then save the changes:

 //save a b         


        
3条回答
  •  一向
    一向 (楼主)
    2020-12-14 16:47

    Here is a sample function that you could use to save the comments. It allows you to edit one key/value pair at a time. I've also added some stuff to format the file nicely based on the way I commonly use the files (You could easily remove that if you want). I hope this might help someone else in the future.

    public static bool setConfigValue(Configuration config, string key, string val, out string errorMsg) {
        try {
            errorMsg = null;
            string filename = config.FilePath;
    
            //Load the config file as an XDocument
            XDocument document = XDocument.Load(filename, LoadOptions.PreserveWhitespace);
            if(document.Root == null) {
                errorMsg = "Document was null for XDocument load.";
                return false;
            }
            XElement appSettings = document.Root.Element("appSettings");
            if(appSettings == null) {
                appSettings = new XElement("appSettings");
                document.Root.Add(appSettings);
            }
            XElement appSetting = appSettings.Elements("add").FirstOrDefault(x => x.Attribute("key").Value == key);
            if (appSetting == null) {
                //Create the new appSetting
                appSettings.Add(new XElement("add", new XAttribute("key", key), new XAttribute("value", val)));
            }
            else {
                //Update the current appSetting
                appSetting.Attribute("value").Value = val;
            }
    
    
            //Format the appSetting section
            XNode lastElement = null;
            foreach(var elm in appSettings.DescendantNodes()) {
                if(elm.NodeType == System.Xml.XmlNodeType.Text) {
                    if(lastElement?.NodeType == System.Xml.XmlNodeType.Element && elm.NextNode?.NodeType == System.Xml.XmlNodeType.Comment) {
                        //Any time the last node was an element and the next is a comment add two new lines.
                        ((XText)elm).Value = "\n\n\t\t";
                    }
                    else {
                        ((XText)elm).Value = "\n\t\t";
                    }
                }
                lastElement = elm;
            }
    
            //Make sure the end tag for appSettings is on a new line.
            var lastNode = appSettings.DescendantNodes().Last();
            if (lastNode.NodeType == System.Xml.XmlNodeType.Text) {
                ((XText)lastNode).Value = "\n\t";
            }
            else {
                appSettings.Add(new XText("\n\t"));
            }
    
            //Save the changes to the config file.
            document.Save(filename, SaveOptions.DisableFormatting);
            return true;
        }
        catch (Exception ex) {
            errorMsg = "There was an exception while trying to update the config value for '" + key + "' with value '" + val + "' : " + ex.ToString();
            return false;
        }
    }
    

提交回复
热议问题