Хирургическое редактирование XML с помощью Powershell
Я работаю с файлами csproj, используя Powershell для масштабного редактирования ссылок на проекты. До сих пор мне удавалось редактировать атрибуты Include в ProjectReferences, используя следующие строки:
$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)
Это работает и заменяет атрибут Include в соответствующих ProjectReferences, как я ожидаю. Тем не менее, существует множество дополнительных "безвредных" изменений, таких как форматирование всех тегов в отдельной строке, например<FileUpgradeFlags></FileUpgradeFlags>
становится
<FileUpgradeFlags>
</FileUpgradeFlags>
Есть ли способ выполнить такое редактирование, которое не имеет этих побочных эффектов?
edit: для ясности всем, кто находит этот пост по другим причинам, Select-MsBuildXml - это просто функция-обертка, которую я написал для Select-Xml, которая предварительно загружает параметр пространства имен с пространством имен msbuild, а затем расширяет свойство узла.
1 ответ
Несколько лет назад я много занимался проектами 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)
Обновление - попробуйте установить PreserveWhitespace
свойство true перед загрузкой XML-документа, как показано выше.