web.config xpath transform - 按父元素查找

时间:2014-03-14 23:38:27

标签: asp.net-mvc visual-studio-2012 deployment visual-studio-2013

我正在尝试在部署后更改日志文件名,因此转换它:

<log4net>
    ...
    <appender name="GeneralAppender" type="log4net.Appender.RollingFileAppender, log4net">
        <file value="c:\logs\Co.App.log" />
    ...
    </appender>
</log4net>

到此:

<log4net>
    ...
    <appender name="GeneralAppender" type="log4net.Appender.RollingFileAppender, log4net">
        <file value="c:\logs\Co.App.localhost.log" />
    ...
    </appender>
</log4net>

实际的文件节点没有任何属性,所以我试图通过父节点找到它

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <log4net>
        <appender >
          <file value="c:\logs\Co.App.localhost.log" xdt:Transform="Replace" xdt:Locator="XPath(../appender[@name='GeneralAppender'])" />
        </appender>
      </log4net>
    </assemblyBinding>
  </runtime>

我也尝试了绝对和相对xpath的所有排列,但我没有看到它对变换预览有任何影响。

我试过了:

  

XDT:定位=&#34;的XPath(//附加器[@name =&#39; GeneralAppender&#39;] /文件)&#34;

甚至:

  

XDT:变换=&#34;删除&#34; XDT:定位=&#34;的XPath(//文件)&#34;

3 个答案:

答案 0 :(得分:12)

找到它了!

<file value="c:\logs\Co.App.local.log" xdt:Transform="Replace" xdt:Locator="Condition(../@name='GeneralAppender')" />

答案 1 :(得分:2)

轻微扩展:

如果父节点有两个(或更多子节点),则上述解决方案是不够的。

当使用EventLogAppend时,log4net就是这种情况,它具有:

  <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
    ...
    <param name="LogName" value="MyLog"/>
    <param name="ApplicationName" value="MyApplication"/>
    ...

然后你需要使用&#39;和&#39; +更多属性来命中正确的节点: 比如xdt:Locator =&#34;条件(../@ name =&#39; EventLogAppender&#39; 和@name =&#39; LogName&#39;

EventLogAppender的示例,其中两个参数都被替换:

<param name="LogName" value="MyNewLog" xdt:Transform="Replace" xdt:Locator="Condition(../@name='EventLogAppender' and @name='LogName')" />
<param name="ApplicationName" value="MyNewApplication" xdt:Transform="Replace" xdt:Locator="Condition(../@name='EventLogAppender' and @name='ApplicationName')" />

答案 2 :(得分:0)

MSDN documentation提到,如果您使用XPath,则它将在传递文件中附加传递给当前上下文的表达式。因此,XPath非常适合您要修改当前元素或其前身之一的情况。

就好像您想以相对方式遍历父级一样,没有XPath表达式可以这样做。 XPath以父级开头,并允许您遍历子级而不是子级。那是条件起作用的时候。

我尝试使用xdt:Locator =“ XPath(。)”,它可以很好地替换当前元素,并且在需要时可以替换它的后代。但这并不适合上升。