如何使用Powershell从csproj(xml)中删除Private元素(复制本地)

时间:2012-11-08 18:40:06

标签: xml powershell-v2.0 csproj

我正在尝试从csproj xml中删除Project / ItemGroup / Reference / Private元素。

    $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”)。为什么它可以找到子节点私有?

1 个答案:

答案 0 :(得分: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)) 
            }
        }