转换保留名称空间前缀

时间:2013-09-20 20:21:05

标签: visual-studio-2012 nlog xdt-transform

我正在尝试使用此XDT部分将NLog自定义配置部分插入到我的Web.config中:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" throwExceptions="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xdt:Transform="InsertIfMissing" >
    <targets>
        <target xsi:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" />
    </targets>
    <rules>
        <logger name="*" minlevel="Trace" writeTo="logfile" />
    </rules>
</nlog>

当我运行XDT转换时,我的Web.Debug.config包含:

<nlog throwExceptions="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
    <targets>
        <target d4p1:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
    </targets>
    <rules>
        <logger name="*" minlevel="Trace" writeTo="logfile" />
    </rules>
</nlog>

通常,名称空间前缀是任意的,因此将xsi转换为d4p1不会导致任何问题。

但是,当我使用d4p1时,我在NLog的应用程序中遇到运行时异常。手动将d4p1的实例更改为xsi可以解决问题,但如果用户需要在以后手动更改文件,则会破坏配置转换的实用程序。

有没有办法使用XDT保留名称空间前缀?

2 个答案:

答案 0 :(得分:2)

我们遇到了完全相同的问题。我不确定为什么突然开始发生特定项目,但我们的解决方案是将xsi命名空间添加到原始配置文件的顶层(即转换工作的基本文件)。所以......

<configuration>

......会变成......

<configuration xmlns:xsi="http://www.nlog-project.org/schemas/NLog.xsd">

这就是诀窍。

另一种方法也适用于在nlog元素的子元素上应用变换。

希望能有所帮助。

答案 1 :(得分:1)

当我将xdt:Transform属性从目标和规则标记移动到nlog时,我开始看到这个问题。将它们移回原来的标签会解决它:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" throwExceptions="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets xdt:Transform="InsertIfMissing">
    <target xsi:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>
  <rules xdt:Transform="InsertIfMissing">
    <logger name="*" minlevel="Trace" writeTo="logfile" />
  </rules>
</nlog>