2011-02-28 74 views
6

我正在使用Powershell使用csproj文件來執行項目引用的大規模編輯。到目前爲止,我已經成功地使用以下行ProjectReferences編輯的屬性包括:使用Powershell進行手術XML編輯

$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屬性。但是,還有很多額外的「無害」更改,例如在自己的產品線上格式化所有標籤,例如
<FileUpgradeFlags></FileUpgradeFlags>

成爲

<FileUpgradeFlags>
</FileUpgradeFlags>

有什麼辦法來進行編輯,如這一點,沒有這些副作用? Select-MsBuildXml只是一個包裝函數,我在Select-Xml中編寫了一個包裝函數,它用msbuild命名空間預加載命名空間參數,然後展開節點屬性。

+0

我很想知道爲什麼多餘的空格給你帶來問題。 – 2011-02-28 21:43:11

+1

主要是因爲它在審查更改時創建了額外的工作,並且還因爲它在源代碼控制中創建了不必要的流失。在病態情況下,VS會選擇將所有這些斷行標籤重新格式化爲單行元素,從而在下一次對csproj文檔進行更改時將所有內容重新激活,並且兩者都被鎖定在令人惱怒的格式抓鬥中。 – bwerks 2011-02-28 23:47:09

+1

這可以通過Select-XML而不是Select-MsBuildXml來完成(並顯示)以使這個答案更適用於其他人嗎? – 2011-09-22 16:14:43

回答

12

幾年前,我做了很多VS項目操作。好像在創建XmlDocument的直接使用Load(與使用獲取內容和鑄造XML)爲我工作好:

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

更新 - 如圖所示嘗試加載XML文檔之前設置PreserveWhitespace屬性爲true以上。

+0

感謝您的提示,但不幸的是,結果似乎是一樣的。希望VS會對非標準格式的文件很溫和。 – bwerks 2011-03-02 19:34:13

+1

我更新了包含在XmlDocument上設置'PreserveWhitespace'屬性的答案。這似乎有幫助。 – 2011-03-04 21:01:01

+0

最優秀!這將爲我節省很多審閱頭痛。非常感謝你! – bwerks 2011-03-07 00:06:08