如何从MSBuild脚本更新XML属性?

如何从MSBuild脚本更新XML属性?,xml,msbuild,msbuildcommunitytasks,Xml,Msbuild,Msbuildcommunitytasks,我正在使用and(使用XMLUpdate和)来更新Web.config的各个部分,但有一件事让我感到困惑。如果我有: <configuration> <nlog throwExceptions="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets>

我正在使用and(使用XMLUpdate和)来更新Web.config的各个部分,但有一件事让我感到困惑。如果我有:

<configuration>
    <nlog throwExceptions="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <targets>
            <target name="file" xsi:type="File" fileName="${logDirectory}\SomeLog.log" layout="${message}"/>
        </targets>
    </nlog> 
</configuration>
它报告说找不到任何要更新的内容,所以我的问题是如何才能将filename属性更新


编辑:当NLog部分定义自己的名称空间时,是否会发生名称空间冲突


更新:声明名称空间的已发布答案无效。

它表示名称空间的要求

<XmlUpdate
   Namespace="http://schemas.microsoft.com/.NetConfiguration/v2.0"
   XmlFileName ....

第一个问题是xpath在更新属性时不正确,它当前正在查找具有名为“fileName”属性的“target”节点,而不是名为“target”的节点的“fileName”属性

您需要的xpath是: /配置/nlog/targets/target/@fileName

至于名称空间问题,您需要使用名称空间前缀,这也必须应用于每个子元素,因为它们都在该名称空间中

最后声明如下:

<XmlUpdate
  Prefix="n"
  Namespace="http://www.nlog-project.org/schemas/NLog.xsd"
  XmlFileName="output.xml"
  XPath="//configuration/n:nlog/n:targets/n:target/@fileName"
  Value="${logDirectory}\UpdateWorked.log" />

要完成(我想你应该给他奖金)给出的答案,请看:

<XmlUpdate
  XmlFileName="web.config"
  XPath="//configuration/x:nlog/x:targets/x:target/@fileName"
  Value="%24{logDirectory}\SomeLog_%(Configuration.Identity).log"
  Prefix="x"
  Namespace="http://www.nlog-project.org/schemas/NLog.xsd"
  />


在这里,我使用
%24
写出特殊字符
$

这很有帮助,但不能解决手头的问题。我还有其他XMLUpdate任务,这些任务没有声明名称空间,但更新正确
<XmlUpdate
  XmlFileName="web.config"
  XPath="//configuration/x:nlog/x:targets/x:target/@fileName"
  Value="%24{logDirectory}\SomeLog_%(Configuration.Identity).log"
  Prefix="x"
  Namespace="http://www.nlog-project.org/schemas/NLog.xsd"
  />