配置文件XDT转换InsertIfMissing正在跳过子项

时间:2017-11-14 13:22:21

标签: asp.net xml web-config nuget transformation

我无法进行配置转换,在nuget package install上添加应用设置,其中元素appSetting可能存在,也可能不存在。

我想要发生什么:

  • appSetting元素不存在
    • 插入appSetting元素及其子元素
  • appSetting元素存在
    • 如果缺少则插入子项

我只能让一个或另一个工作,但不是两个场合。

web.config.install.xdt

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appSettings xdt:Transform="InsertIfMissing" >
    <add key="Swagger.Contact.Name" value="Some Name" xdt:Transform="InsertIfMissing" />
    <add key="Swagger.Contact.Email" value="some@email.address" xdt:Transform="InsertIfMissing" />
  </appSettings>
</configuration>

示例1

web.config BEFORE

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" maxRequestLength="51200" />
    <customErrors mode="Off" />
  </system.web>
</configuration>
转化前

appSettings元素不存在

web.config AFTER

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" maxRequestLength="51200" />
    <customErrors mode="Off" />
  </system.web>
  <appSettings>
    <add key="Swagger.Contact.Name" value="Some Name" />
    <add key="Swagger.Contact.Email" value="some@email.address" />
  </appSettings>
</configuration>

示例2

web.config BEFORE

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" maxRequestLength="51200" />
    <customErrors mode="Off" />
  </system.web>
  <appSettings>
    <add key="Other.Key" value="With Some Value" />
  </appSettings>
</configuration>
转化前

appSettings元素现在

web.config AFTER

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" maxRequestLength="51200" />
    <customErrors mode="Off" />
  </system.web>
  <appSettings>
    <add key="Other.Key" value="With Some Value" />
  </appSettings>
</configuration>

在示例2中没有任何事情发生,因为appSettings元素已经存在,我希望它仍然评估它的子元素并插入它们,如果它们不存在,但它们似乎只是被忽略了。我可以使用的属性xdt:Transform是否有任何其他值,或任何其他黑客可以解决此问题?

1 个答案:

答案 0 :(得分:2)

我有一段类似的问题。我应用的解决方法是在XDT文件中有两个带有<appSettings>的条目,一个用于检查它是否缺席,如果是,则继续并插入它。另一个是针对<appSettings>元素已经存在的情况。以下是帮助您解决问题的简短代码:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <appSettings xdt:Transform="InsertIfMissing">
    </appSettings>
    <appSettings>
      <add key="Swagger.Contact.Name" value="Some Name" xdt:Transform="InsertIfMissing" />
      <add key="Swagger.Contact.Email" value="some@email.address" xdt:Transform="InsertIfMissing" />
    </appSettings>
</configuration>

请告诉我这是否适合您。