Advanced tasks using Web.Config transformation

前端 未结 2 1678
时光说笑
时光说笑 2020-12-04 08:20

Does anyone know if there is a way to \"transform\" specific sections of values instead of replacing the whole value or an attribute?

For example, I\'ve got several

相关标签:
2条回答
  • 2020-12-04 09:01

    As a matter of fact you can do this, but it is not as easy as you might think. You can create your own config transformation. I have just written a very detailed blog post at http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx regarding this. But here are the hightlights:

    • Create Class Library project
    • Reference Web.Publishing.Tasks.dll (under %Program Files (x86)%MSBuild\Microsoft\VisualStudio\v10.0\Web folder)
    • Extend Microsoft.Web.Publishing.Tasks.Transform class
    • Implement the Apply() method
    • Place the assembly in a well known location
    • Use xdt:Import to make the new transform available
    • Use transform

    Here is the class I created to do this replace

    namespace CustomTransformType
    {
        using System;
        using System.Text.RegularExpressions;
        using System.Xml;
        using Microsoft.Web.Publishing.Tasks;
    
        public class AttributeRegexReplace : Transform
        {
            private string pattern;
            private string replacement;
            private string attributeName;
    
            protected string AttributeName
            {
                get
                {
                    if (this.attributeName == null)
                    {
                        this.attributeName = this.GetArgumentValue("Attribute");
                    }
                    return this.attributeName;
                }
            }
            protected string Pattern
            {
                get
                {
                    if (this.pattern == null)
                    {
                        this.pattern = this.GetArgumentValue("Pattern");
                    }
    
                    return pattern;
                }
            }
    
            protected string Replacement
            {
                get
                {
                    if (this.replacement == null)
                    {
                        this.replacement = this.GetArgumentValue("Replacement");
                    }
    
                    return replacement;
                }
            }
    
            protected string GetArgumentValue(string name)
            {
                // this extracts a value from the arguments provided
                if (string.IsNullOrWhiteSpace(name)) 
                { throw new ArgumentNullException("name"); }
    
                string result = null;
                if (this.Arguments != null && this.Arguments.Count > 0)
                {
                    foreach (string arg in this.Arguments)
                    {
                        if (!string.IsNullOrWhiteSpace(arg))
                        {
                            string trimmedArg = arg.Trim();
                            if (trimmedArg.ToUpperInvariant().StartsWith(name.ToUpperInvariant()))
                            {
                                int start = arg.IndexOf('\'');
                                int last = arg.LastIndexOf('\'');
                                if (start <= 0 || last <= 0 || last <= 0)
                                {
                                    throw new ArgumentException("Expected two ['] characters");
                                }
    
                                string value = trimmedArg.Substring(start, last - start);
                                if (value != null)
                                {
                                    // remove any leading or trailing '
                                    value = value.Trim().TrimStart('\'').TrimStart('\'');
                                }
                                result = value;
                            }
                        }
                    }
                }
                return result;
            }
    
            protected override void Apply()
            {
                foreach (XmlAttribute att in this.TargetNode.Attributes)
                {
                    if (string.Compare(att.Name, this.AttributeName, StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        // get current value, perform the Regex
                        att.Value = Regex.Replace(att.Value, this.Pattern, this.Replacement);
                    }
                }
            }
        }
    }
    

    Here is web.config

    <?xml version="1.0"?>
    <configuration>
      <appSettings>
        <add key="one" value="one"/>
        <add key="two" value="partial-replace-here-end"/>
        <add key="three" value="three here"/>
      </appSettings>
    </configuration>
    

    Here is my config transform file

    <?xml version="1.0"?>
    
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    
      <xdt:Import path="C:\Program Files (x86)\MSBuild\Custom\CustomTransformType.dll"
                  namespace="CustomTransformType" />
    
      <appSettings>
        <add key="one" value="one-replaced" 
             xdt:Transform="Replace" 
             xdt:Locator="Match(key)" />
        <add key="two" value="two-replaced" 
             xdt:Transform="AttributeRegexReplace(Attribute='value', Pattern='here',Replacement='REPLACED')" 
             xdt:Locator="Match(key)"/>
      </appSettings>
    </configuration>
    

    Here is the result after transformation

    <?xml version="1.0"?>
    <configuration>
      <appSettings>
        <add key="one" value="one-replaced"/>
        <add key="two" value="partial-replace-REPLACED-end"/>
        <add key="three" value="three here"/>
      </appSettings>
    </configuration>
    
    0 讨论(0)
  • 2020-12-04 09:25

    Just as an update, if you're using Visual Studio 2013, you should reference %Program Files (x86)%MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.XmlTransform.dll instead.

    0 讨论(0)
提交回复
热议问题