首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSBuild - XPath - XmlPeek可以读,但XmlPoke不能写

MSBuild - XPath - XmlPeek可以读,但XmlPoke不能写
EN

Stack Overflow用户
提问于 2014-06-23 16:33:36
回答 1查看 4.1K关注 0票数 4

我使用MSBuild来操作我的项目(.csproj)文件,以更新对静态文件的引用。静态文件将由我的CI服务器(TeamCity)构建,然后在构建项目本身之前,需要更新项目使用的引用。

下面是csproj文件(全版)中的Xml示例:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="12.0">
 <ItemGroup>
    <Content Include="packages\pMixins.0.1.7.nupkg">
       <IncludeInVSIX>true</IncludeInVSIX>
    </Content>

我编写了一个MSBuild任务:

代码语言:javascript
复制
<Target Name="ReplaceNugetPackageDependency" BeforeTargets="PrepareForBuild" >
<XmlPoke 
    XmlInputPath="$(MSBuildProjectFile)" 
    Query="//n:Project/n:ItemGroup/
                n:Content[starts-with(@Include, 'packages')]/@Include" 
    Value="TEST-TEST"
    Namespaces="&lt;Namespace Prefix='n' 
                Uri='http://schemas.microsoft.com/developer/msbuild/2003'   
                Name='DoNotKnowWhatThisIsFor-ButItIsRequired' /&gt;" >
 </XmlPoke>             
 </Target>

但是当我运行它时,我会得到消息0 replacements

因此,我添加了一个XmlPeek任务来测试查询:

代码语言:javascript
复制
<XmlPeek 
    XmlInputPath="$(MSBuildProjectFile)" 
    Query="/n:Project/n:ItemGroup/
            n:Content[starts-with(@Include, 'packages')]/@Include" 
    Namespaces="&lt;Namespace Prefix='n' 
                Uri='http://schemas.microsoft.com/developer/msbuild/2003'   
                Name='DoNotKnowWhatThisIsFor-ButItIsRequired' /&gt;">
         <Output TaskParameter="Result" ItemName="Peeked" />     
</XmlPeek>
<Message Text="Text: @(Peeked)"/>

当我运行时,MSBuild XmlPeek能够读取Xml:

代码语言:javascript
复制
 Text: packages\pMixins.0.1.7.nupkg

查询是相同的exactlyWhy can't XmlPoke manipulate the Xml if XmlPeek can read it?

更新

经过几个小时的处理,我终于找到了一个XPath查询,它可以让XmlPoke做我想做的事情:

代码语言:javascript
复制
Query="//n:Project/n:ItemGroup/
        n:Content[starts-with(@Include, 'packages')]/n:IncludeInVSIX/../@Include"

为什么有必要添加/n:IncludeInVSIX/..?这是个窃听器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-14 17:52:24

我只想向其他遇到这种情况的人确认,这实际上是如何避免在XmlPeek任务和XmlPoke任务中不能使用相同的XmlPeek查询的问题。

用于替换常规AppSettings中web.config元素的"file“属性值的原始查询:

代码语言:javascript
复制
  <appSettings file="devsettings.config">
    <add key="BuildVersion" value="" />
  </appSettings>

为了获得XmlPeek任务中的"file“属性,我使用了以下XPath查询:

//appSettings@file=‘devSetings.config’/@file

但是,这个查询在XmlPoke任务中不能工作。相反,下面的工作方式就像@philip-pittle在他对这个问题的更新中发现的。

//appSettings@file='devsettings.config'/add/../@file

代码语言:javascript
复制
  <XmlPeek XmlInputPath="$(_BuildPath)web.config"
      Query="//appSettings[@file='devsettings.config']/@file">
    <Output TaskParameter="Result" ItemName="ExistingPeeked" />
  </XmlPeek> 
  <XmlPoke XmlInputPath="$(_BuildPath)web.config" 
    Query="//appSettings[@file='devsettings.config']/add/../@file" 
    Value="$(_EnvironmentConfig)" />

这是使用以下版本的MSBuild。

Microsoft (R)构建引擎版本12.0.31101.0

微软.NET框架,4.0.30319.18444版本

可能是虫子?但绝对是奇怪的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24370918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档