Click here to Skip to main content
15,860,972 members
Articles / Programming Languages / C#
Article

XmlConfigMerge - Merge config file settings

Rate me:
Please Sign up or sign in to vote.
4.54/5 (17 votes)
6 Nov 20061 min read 117.3K   1.6K   59   19
Supports merging of .config file settings, such as in a push to staging-server deployment environment. Also supports XPath updates. Class library and Console app provided.

Introduction

When deploying .NET applications, it is often desirable to "merge" configuration settings between a "distribution" .config file and an existing .config file.

This is particularly useful when new config parameters are added to a "distribution" config file, and an existing .config file (such as on an already-configured server) must have these new parameters added, while preserving existing parameter settings.

The XmlConfigMerge utility (provided both as a library assembly and as a console application) supports this merging of XML .config files, and also supports setting of specific parameters via XPath filtering and optional Regex pattern matching.

Example Usage Scenarios

  • Code Promotion: Push release from development to staging: Use to add newly-added development parameters while preserving existing staging parameters. (See "Example C# Code" below.)
  • Publisher Policy Files: Set the binding redirect parameters such that the AssemblyVersion in the latest build is specified (see "Example C# Code within a NAnt script" below.)
  • Windows Installer Packages: Maintain existing application .config settings (from a prior install).

Example C# Code

C#
//Merge an "existing" config's settings into a "distrib" config, 
//writing out results to "existing" config
ConfigFileManager config = new ConfigFileManager(DistribConfigFile,
        ExistingConfigFile,
        true); //makeMergeFromConfigPathTheSavePath

//Regex pattern replace having single regex group to be replaced within
//pattern, matching multiple config items
config.ReplaceXPathValues(
        "//@value", 
        "QAServer/QAVirtDir1", 
        new Regex(@"http://(.*)/service.ashx") );

//appsettings key-value pair set for existing param. 
//It is created if it does not exist.
config.ReplaceXPathValues(
        "/configuration/appSettings/add[@key='param2']/@value",
        "QA-value2");

config.Save();

Example C# Code within a NAnt script

C#
<!-- Set the publisher-policy file newVersion attribute -->

<property value="policyTheAssemblyName.xml" name="policyFileName"/>
<property value="3.1.25.0" name="policyAssemblyVersion"/>
        
<script language="C#">
    <code><![CDATA[
        public static void ScriptMain(Project project) {
            policyFileName = project.Properties["policyFileName"];
            project.Log(Level.Info, "Modifying policy file: " + 
                        policyFileName);

            //Modify
            ConfigFileManager config = 
                  new ConfigFileManager(policyFileName);
            LogInfoLines(project, config.ReplaceXPathValues(
                    "//*[local-name()='bindingRedirect']/@newVersion",
                    project.Properties["policyAssemblyVersion"] ) );
            config.Save();
        }
                
        private static void LogInfoLines(Project project, 
                                         string[] lines) {
            foreach (string line in lines) {
                project.Log(Level.Info, line);
            }
        }
    ]]></code>
    <references>
        <includes name="${nant.location}\XmlConfigMerge.dll"/>
    </references>
    <imports>
        <import name="Tools.XmlConfigMerge"/>
    </imports>
</script>

Example Command-Line

XmlConfigMergeConsole.exe "..\MergeDistribConfigFiles\web.config" 
-m "..\MergeExistingConfigFiles\web.config" -mwritten
-r "//@value" "QAServer/QAVirtDir1" "http://(.*)/service.ashx"
-r "/configuration/appSettings/add[@key='param2']/@value" "QA-value2"

Further Examples

See the included unit-tests (utilizing NUnit) for additional usage examples.

Release Notes

  • Version 1.3 - 11/06/2006: Changed to use share mode on file opens, added error handling.
  • Version 1.2: Fix for master child nodes not being preserved when not present in merge-from doc.
  • Version 1.1: Handles duplicate appSettings keys in a manner consistent with System.Configuration (uses last one); added precondition checks.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
buc
Web Developer
United States United States
.NET solution architect / developer based in Chicago.

Check out the InRule .NET Business Rule Engine - 30 day trial download available:

www.inrule.com

Comments and Discussions

 
QuestionLicensing Pin
rafik198227-Mar-17 7:58
rafik198227-Mar-17 7:58 
QuestionLicensing question Pin
Member 109324338-Jul-14 2:56
Member 109324338-Jul-14 2:56 
AnswerRe: Licensing question Pin
martinhughesireland224-Nov-16 4:12
martinhughesireland224-Nov-16 4:12 
GeneralRe: Licensing question Pin
rafik198227-Mar-17 8:47
rafik198227-Mar-17 8:47 
QuestionHelpful tool Pin
mmsharp11-Nov-13 10:04
mmsharp11-Nov-13 10:04 
AnswerRe: Helpful tool Pin
rafik198227-Mar-17 8:47
rafik198227-Mar-17 8:47 
QuestionVery good useful tool! Pin
David in Clearwater, Fl.9-Dec-11 7:10
David in Clearwater, Fl.9-Dec-11 7:10 
AnswerRe: Very good useful tool! Pin
rafik198227-Mar-17 8:47
rafik198227-Mar-17 8:47 
QuestionVery useful tool! Pin
David in Clearwater, Fl.9-Dec-11 7:00
David in Clearwater, Fl.9-Dec-11 7:00 
AnswerRe: Very useful tool! Pin
rafik198227-Mar-17 8:48
rafik198227-Mar-17 8:48 
GeneralDid you hear something about DotNet.Helper Project Pin
void leenux();15-Apr-11 2:04
void leenux();15-Apr-11 2:04 
GeneralThanks a lot! Pin
humanier26-Aug-10 3:47
humanier26-Aug-10 3:47 
QuestionUsing this at runtime, how do you refresh the config file to reflect the changes? Pin
Leon van Wyk10-Oct-08 3:05
professionalLeon van Wyk10-Oct-08 3:05 
QuestionNAnt and msi's? Pin
robrich6-Nov-06 9:32
robrich6-Nov-06 9:32 
GeneralXML Diff and Patch GUI Tool Pin
Christian Birkl26-Sep-06 7:17
Christian Birkl26-Sep-06 7:17 
GeneralGood tool Pin
Mark Focas29-Jun-04 19:41
Mark Focas29-Jun-04 19:41 
GeneralAvoiding problems with schemas Pin
Member 219559528-Jun-04 0:31
Member 219559528-Jun-04 0:31 
GeneralRe: Avoiding problems with schemas Pin
buc3-Jul-04 9:57
buc3-Jul-04 9:57 
GeneralRe: Avoiding problems with schemas Pin
thanigaivelanb22-Jan-09 23:03
thanigaivelanb22-Jan-09 23:03 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.