使用Powershell进行外科XML编辑

bwe*_*rks 7 xml powershell formatting side-effects select-xml

我正在使用Powershell处理csproj文件,以执行项目引用的大规模编辑.到目前为止,我已经设法使用以下行编辑ProjectReferences上的Include属性:

    $projectXml = [xml](Get-Content $_.Project.FullName)
    Add-TfsPendingChange -edit $_.Project.FullName -ErrorAction Stop
    $projectXml | Select-Xml -namespace @{msb = "http://schemas.microsoft.com/developer/msbuild/2003"} -xpath "//msb:ProjectReference[msb:Project='$projectGuid']" | Select-Object -ExpandProperty Node | foreach { $_.Include = "$newPath" }
    $projectXml.Save($_.Project.FullName)
Run Code Online (Sandbox Code Playgroud)

这可以工作,并按照我的预期替换相应ProjectReferences上的Include属性.但是,还有很多额外的"无害"更改,例如在自己的行上格式化所有标记,例如
<FileUpgradeFlags></FileUpgradeFlags>

<FileUpgradeFlags>
</FileUpgradeFlags>

有没有办法执行这样的编辑,没有这些副作用?

编辑:为了清楚任何因其他原因发现此帖子的人,Select-MsBuildXml只是我在Select-Xml周围编写的包装函数,它使用msbuild命名空间预加载namespace参数,然后扩展node属性.

Kei*_*ill 12

几年前我做了很多VS项目操作.看起来像创建XmlDocument并直接使用Load(而不是使用Get-Content和cast to XML)对我来说效果更好:

$path = "C:\temp\foo.csproj"
$proj = new-object system.xml.xmldocument
$proj.PreserveWhitespace = $true
$proj.Load($path)
...
$proj.Save($path)
Run Code Online (Sandbox Code Playgroud)

更新 - 尝试PreserveWhitespace在加载XML文档之前将属性设置为true,如上所示.