Question:
I’m working with csproj files using Powershell to perform large-scale editing of project references. So far I’ve managed to edit the Include attributes on ProjectReferences using the following lines:
1 2 3 4 5 |
$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) |
This works, and replaces the Include attribute on the appropriate ProjectReferences as I expect. However, there are plenty of additional “harmless” changes made, such as formatting all tags on their own line, e.g.
<FileUpgradeFlags></FileUpgradeFlags>
becomes
<FileUpgradeFlags>
</FileUpgradeFlags>
Is there any way to perform an edit such as this that doesn’t have these side effects?
edit: for clarity to anyone who finds this post for other reasons, Select-MsBuildXml is just a wrapper function I wrote around Select-Xml that pre-loads the namespace parameter with the msbuild namespace, and expands the node property afterwards.
Answer:
I did a lot of VS project manipulation a few years back. Seems like creating the XmlDocument and using Load directly (versus using Get-Content and casting to XML) worked better for me:
1 2 3 4 5 6 7 |
$path = "C:\temp\foo.csproj" $proj = new-object system.xml.xmldocument $proj.PreserveWhitespace = $true $proj.Load($path) ... $proj.Save($path) |
Update – Try setting the PreserveWhitespace
property to true before loading the XML document as shown above.