【问题标题】:Replacing entire node using web.config transforms resulting in error使用 web.config 转换替换整个节点导致错误
【发布时间】:2016-08-30 08:53:39
【问题描述】:

我无法完全弄清楚我在这里做错了什么。我在网络配置中有一个节点:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    ...
    <runtime>
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
           <dependentAssembly>
              <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
              <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
           </dependentAssembly>
           ....

我想替换这个:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>

使用 MsBuild TransformXml。不过,我不能完全弄清楚 xdt 属性的正确语法。以下(对我来说看起来是正确的):

<dependentAssembly xdt:Transform="Replace" 
                                    xdt:Locator="Condition(param/@name='Newtonsoft.Json'">
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>

正在导致错误:

XmlNodeException : Transform 和 Locator 属性必须仅包含 类型名称,或类型名称后跟属性列表 括号。

我在这里错过了什么?

我无法更改原始 BTW,这必须使用转换来完成。

【问题讨论】:

  • 你可以试试这个转换吗 - &lt;dependentAssembly xdt:Transform="Replace" xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Newtonsoft.Json')"&gt;
  • 这会导致错误 XmlNodeException : '/configuration/runtime/_defaultNamespace:assemblyBinding/_defaultNamespace:dependentAssembly[./_defaultNamespace:assemblyIdentity/‌​@name='Newtonsoft.Js‌​on']' has an invalid token. @alex。谢谢
  • 嗯,我唯一能找到您最初遇到的错误的地方是 - github.com/micahlmartin/XmlTransformer/blob/master/src/… - 这是一个第 3 方解析器...?

标签: xml xpath msbuild msbuild-4.0 xml-document-transform


【解决方案1】:

属性name='Newtonsoft.Json' 位于名为assemblyIdentity 的父元素中,所以我不确定为什么param/@name。用于测试名为 -ignoring namespaces- 'assemblyIdentity' 的子元素是否具有属性 name 值等于 'Newtonsoft.Json' 的正确 XPath 表达式如下:

xdt:Locator="Condition(*[local-name()='assemblyIdentity']/@name='Newtonsoft.Json')"

【讨论】:

    【解决方案2】:

    问题基本上是名称空间。 在你的 xdt 文件中定义这个命名空间。

    <configuration xmlns:asm="urn:schemas-microsoft-com:asm.v1" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    

    像这样使用新的命名空间:

    <asm:assemblyBinding>
      <asm:dependentAssembly xdt:Transform="Replace" xdt:Locator="Condition(asm:assemblyIdentity/@name='Newtonsoft.Json')" >
        <asm:assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
        <asm:bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </asm:dependentAssembly>
    </asm:assemblyBinding>
    

    我认为这比 local-name() 版本更优雅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多