xml - 使用 Powershell 进行外科 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)

这有效,并按照我的预期替换了适当 ProjectReferences 上的 Include 属性。但是,还有许多额外的“无害”更改,例如在自己的行上格式化所有标签,例如
<FileUpgradeFlags></FileUpgradeFlags>

变成

<FileUpgradeFlags>
</FileUpgradeFlags>

有没有什么方法可以进行这样的编辑而不会产生这些副作用?

编辑:为了让任何因其他原因发现这篇文章的人清楚起见,Select-MsBuildXml 只是我围绕 Select-Xml 编写的一个包装函数,它使用 msbuild 命名空间预加载命名空间参数,然后扩展节点属性。

最佳答案

几年前我做了很多 VS 项目操作。似乎创建 XmlDocument 并直接使用 Load(与使用 Get-Content 和转换为 XML 相比)对我来说效果更好:

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

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

https://stackoverflow.com/questions/5146721/

相关文章:

java - 日期格式 : month abbreviation with dot

asp.net-mvc - 具有自定义格式的 ASP.NET MVC ViewModel 映射

java - 在 javadoc 中将长 URL 分成几行

git - 在一系列 git 提交上运行 git-clang-format

c# - 使 Console.WriteLine() 换行而不是字母

python - 使用 Python locals() 进行字符串格式化有缺点吗?

python - 是否有与 Linux/Unix "fold"命令等效的 Vim?

java - 如何在 Java 中将表格数据格式化为文本?

java - 在 String.format() 中选择参数

ruby - 使用 %w 时包括空格