2012-11-08 25 views
0

我試圖從csproj xml中刪除Project/ItemGroup/Reference/Private元素。如何使用Powershell從csproj(xml)中刪除私有元素(複製本地)

$csproj = [xml] (Get-Content $fullProjectPath) 

    $csproj.Project.ItemGroup | 
     ForEach-Object { $_.Reference } | 
     where { $_.Include -match "^(Some).+"} | 
     ForEach-Object { 
      if($_.Private -ne $null) { 
       $_.RemoveChild($_.SelectSingleNode("Private"))           
      } 
     } 

我得到一個錯誤$ _。SelectSingleNode(「Private」)。爲什麼它可以找到子節點Private?

+0

你得到了什麼錯誤? – Richard

+0

@Richard。使用「1」參數調用「RemoveChild」的異常:「未將對象引用設置爲對象的實例」。 即$ _。SelectSingleNode(「Private」)正在返回一個空對象 – Bhavesh

回答

2

將錯誤信息提供給@Richard問題後,我意識到它必定是XPath出了問題。簡單的XPath有什麼不對?我試圖得到直接的子節點。然後嘗試了經典的調試技術,將輸出寫入控制檯,輸出父節點的InnerXml。在輸出中,我注意到xml輸出具有名稱空間。所以在stackoverflow上的進一步搜索發現瞭如何解決XML命名空間。

這是用於解析命名空間的link。和固定的腳本。

$csproj = [xml] (Get-Content $fullProjectPath) 

    [System.Xml.XmlNamespaceManager] $nsmgr = $xml.NameTable; 
    $nsmgr.AddNamespace('msbuild','http://schemas.microsoft.com/developer/msbuild/2003'); 

    $csproj.Project.ItemGroup | 
     ForEach-Object { $_.Reference } | 
     where { $_.Include -match "^(Some).+"} | 
     ForEach-Object { 
      if($_.Private -ne $null) { 
       $_.RemoveChild($_.SelectSingleNode("msbuild:Private", $nsmgr)) 
      } 
     } 
+0

+1來解決這個問題,並發現爲什麼聲明錯誤而不是「不工作」很重要,甚至在詢問其他人之前也是如此。 – Richard

+0

謝謝。我在發佈之前嘗試調試。但我猜想很難直接思考一天的結束。然後第二天早上你很容易找到答案。 – Bhavesh