如何最好地更新MSBuild中的XML节点

Dea*_*ean 5 xml msbuild web-config msbuildcommunitytasks

我一直在使用Tigris社区任务使用XMLUpdate任务更新各种AppSettings键.

现在,我想在system.net部分添加一个节点来设置代理.

我宣布了一处房产

<PropertyGroup>
    <proxy>&lt;defaultProxy&gt; &lt;proxy usesystemdefault="False" proxyaddress="http://IPADDRESS:PORT" /&gt; &lt;/defaultProxy&gt;</proxy>
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

和XMLUpdate任务看起来像

<XmlUpdate
 Prefix="n"
 Namespace="http://schemas.microsoft.com/.NetConfiguration/v2.0"
 XmlFileName="$(BuildDir)\Builds\_PublishedWebsites\Presentation\Web.config"
 XPath="/n:configuration/n:system.net"
 Value="$(proxy)"  />
Run Code Online (Sandbox Code Playgroud)

这会更新Web配置,但它会直接从属性组更新,即不转换尖括号的转义字符.有没有人有任何想法?

Jul*_*rau 7

您可以使用XmlMassUpdate而不是XmlUpdate任务.

<ProjectExtensions>
  <defaultProxy>
    <proxy usesystemdefault="False" proxyaddress="http://IPADDRESS:PORT"/>
  </defaultProxy>
</ProjectExtensions>

<Target Name="SubstituteFromWebConfig">
  <XmlMassUpdate 
    NamespaceDefinitions="msb=http://schemas.microsoft.com/developer/msbuild/2003;n=http://schemas.microsoft.com/.NetConfiguration/v2.0"
    ContentFile="$(BuildDir)\Builds\_PublishedWebsites\Presentation\Web.config" 
    ContentRoot="/n:configuration/n:system.net"
    SubstitutionsFile="$(MSBuildProjectFullPath)"
    SubstitutionsRoot="/msb:Project/msb:ProjectExtensions/msb:system.web" />
</Target> 
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我们通过替换指向的节点ContentRootContentFile由一个通过指出SubstitutionsRootSubstitutionsFile(当前的MSBuild文件).

这种技术利用了优势的MSBuild ProjectExtensions元素,让您的XML添加到项目文件将由MSBuild引擎被忽略.

(或者,如果您不想使用XmlMassUpdate,则可以在ProjectExtensions和XmlUpdate中的节点上使用XmlRead任务.)