Хирургическое редактирование XML с помощью Powershell - PullRequest
6 голосов
/ 28 февраля 2011

Я работаю с файлами csproj, используя Powershell для масштабного редактирования ссылок на проекты. До сих пор мне удавалось редактировать атрибуты Включить в 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 Ответ

12 голосов
/ 01 марта 2011

Несколько лет назад я много занимался проектами 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, как показано выше.

...