1、方法功能

使用本方法,可以将开发环境最新版本的web.config结构与生产环境环境的config融合,而不用考虑两个config的版本差异值是多少。使用一种标记的方式,在开发环境webconfig上标记哪些节点的哪些属性需要保留为生产环境对应的值,而这种标记不影响开发环境web.config的使用。

2、适用范围

1、将开发环境的webconfig更新到生产环境,不再需要手动改配置值;

2、在多个生产环境中,使用同一份开发环境的webconfig,可转换得到适合本生产环境的最终config;

3、设计依赖

本方法有两个依赖:灵活的xml处理指令标记与逻辑固定的指令解释器,扩展在于指令标记而不是解释器。

3.1灵活的xml处理指令标记

开发环境的webconfig中,在希望保存原有配置值的元素之上写上处理指令,目标为"merge"。对于集合下相同名称的的元素,使用by来指示唯一标识的属性名称是什么,像appSettings下的元素,by="key";使用attr来指示需要保留原有配置值的属性名称,缺省为全部属性,可以写单个,多个中间半角逗号分隔。以下红色部分就是merge指令,它的存在不会影响到开发环境中webconfig本身的正确性。

<appSettings>
<add key="useLocalIPAdress" value="false"/> <!--通过节点的key属性来合并value-->
<?merge by="key" attr="value"?>
<add key="localIPAdress" value="192.168.1.99" /> <!--通过节点的key属性来合并所有属性-->
<?merge by="key"?>
<add key="useProxy" value="true" />
</appSettings>
<!--通过节点名称来合并account,password,sex,age-->
<?merge attr="account,password,sex,age" ?>
<admin account="admin" password="123456" sex="男" age="18" enable="true" />

3.2固定的指令解释器

解释器的功能是将带有指令的config当作xml解析,遍历所有元素,如果元素之上存在"merge"指令,则解析指令的数据内容,通过by的值或自身的节点名称,从旧的config中读取相配的节点,按照attr描述,进行将旧config的值复制过来,最终得到一份融合后的xml数据,转存为web.config文件即可。由于功能单一与逻辑固定,解释器本身不需要进行更新,合并xml大体方法如下:

/// <summary>
/// 将valueXml的值与markXml的结构合并
/// 返回得到的新的xml
/// </summary>
/// <param name="valueXml">带有值的xml</param>
/// <param name="markXml">带有标记的xml</param>
/// <returns></returns>
public static string MergeXml(string valueXml, string markXml)
{
var valueDoc = XDocument.Parse(valueXml);
var markDoc = XDocument.Parse(markXml);
var markElements = markDoc.Descendants().ToArray(); foreach (var markElement in markElements)
{
var mergeMark = markElement.GetMergeMark();
if (mergeMark == null)
{
continue;
} if (string.IsNullOrEmpty(mergeMark.By) == false)
{
var byAttr = markElement.Attribute(mergeMark.By);
var xPath = markElement.GetAbsoluteXPath(byAttr);
valueDoc.XPathSelectElement(xPath).CopyAttrValuesTo(markElement, mergeMark.Attr);
}
else
{
var xPath = markElement.GetAbsoluteXPath();
valueDoc.XPathSelectElement(xPath).CopyAttrValuesTo(markElement, mergeMark.Attr);
}
}
return markDoc.ToString();
}

为了简单,我做了一下文件右键菜单关联,人工更新web.config更方便:

4、项目与下载

https://github.com/xljiulang/ConfigMerge

一种Webconfig自动化升级方法的更多相关文章

  1. MySQL 升级方法指南大全

    原文:MySQL 升级方法指南大全 通常,从一个发布版本升级到另一个版本时,我们建议按照顺序来升级版本.例如,想要升级 MySQL 3.23 时,先升级到 MySQL 4.0,而不是直接升级到 MyS ...

  2. Java中8种常见的排序方法

    排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...

  3. C#与Ranorex自动化公用方法

    原创 - C#与Ranorex自动化公用方法 利用c#在Ranorex上写自动化已经有很长的一段时间了,总结发现常用的方法不外乎如下几种: 1.打开浏览器:或者app public static vo ...

  4. javascript四种类型识别的方法

    × 目录 [1]typeof [2]instanceof [3]constructor[4]toString 前面的话 javascript有复杂的类型系统,类型识别则是基本的功能.javascrip ...

  5. oracle 11g RAC 补丁升级方法

    一.自动升级方法 使用auto方式在两节点分别进行PSU的安装,安装PSU前注意更新opatch工具至PSU所要求版本,p22191577补丁包括GI和DB,分别执行即可. 两节点分别grid用户执行 ...

  6. iOS 三种收起键盘的方法

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  7. 干货:结合Scikit-learn介绍几种常用的特征选择方法

    原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非 ...

  8. 【读书笔记】iOS-开发技巧-三种收起键盘的方法

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  9. 结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

随机推荐

  1. Win7系统如何复制CMD命令提示符框中的内容

    Win7系统如何复制CMD命令提示符框中的内容.. Win7系统如何复制CMD命令提示符框中的内容右键命令提示符窗口的标题栏,选择属性. 选择“编辑选项”里的“快速编辑模式”,并确定: 鼠标左键按下选 ...

  2. 为shell布置陷阱:trap捕捉信号方法论

    本文目录: 1.1 信号说明 1.2 trap布置陷阱 1.3 布置完美陷阱必备知识 家里有老鼠,快消灭它!哎,又给跑了.老鼠这小东西跑那么快,想直接直接消灭它还真不那么容易.于是,老鼠药.老鼠夹子或 ...

  3. 又一流氓推广Microsoft Edge,我勒个去

    最新的Windows10 的升级也是醉了,不得不吐槽一个非常流氓的浏览器推广:Microsoft Edge(这小婊砸). 为了将之前的历史包袱IE干掉,这次微软也是蛮拼的,直接把IE从电脑里干掉了,你 ...

  4. Java GUI学习心得

    虽然GUI的应用已经不是特别广泛了,但是如果了解一点,可以做些自己想要的工具,最近做了一个工具(是什么就不提了),当然碰到很多的问题,都意义解决了,现在分享出来. 1.关于窗体面板的显示问题 可能会遇 ...

  5. C# 反射、与dynamic最佳组合

    在 C# 中反射技术应用广泛,至于什么是反射.........你如果不了解的话,请看下段说明,否则请跳过下段.广告一下:希望我文章的朋友请关注一下我的blog,这也有助于提高本人写作的动力. 反射:当 ...

  6. QT creator编程C++第一步,说“Hello world!”

    这个学期选了计算机学院的<数字图像处理>,正好和我的图像识别项目有所关联,老师说不能用MATLAB来做,这让我一个没学过C++的孩纸欲哭无泪. 只好求助计算机学院的大佬,自学C++. 大佬 ...

  7. 修改 Pattern代码使 Java 正则表达式支持下划线 '_'

    为什么 由于工作是做数据ETL的,很多时候会使用到正则对数据进行提取,但是java的正则中的groupname不支持'_',官方的文档中是这样的: Group name A capturing gro ...

  8. 探索 ConcurrentHashMap 高并发性的实现机制

    很不错的一篇文章,值得一看 http://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/

  9. Windows环境下最新OpenCV和Contribute代码的联合编译

    解决这个问题,目的在于获得并使用最新的完全版本的代码,主要方法是对CMake能够熟练使用,并且对编译等基础支持有所了解. 一.工具的准备 1 tortoisegit www.tortoisegit.o ...

  10. 从聚合数据请求菜谱大全接口数据,解析显示到ListView