如何使用PowerShell从CSPROJ(XML)删除私有元素(复制本地)



我正在尝试从csproj xml中删除项目/itemgroup/referition/私人元素。

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

将错误信息提供给@richard问题后,我意识到XPath一定有问题。简单的XPath可能是什么问题?我试图获得直接的孩子节点。然后尝试了经典的调试技术,将输出写入控制台,输出父节点的interxml。在输出中,我注意到XML输出具有名称空间。因此,在对Stackoverflow进行进一步搜索时,发现了如何解决XML名称空间。

这是解决名称空间的链接。和固定的脚本。

    $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)) 
            }
        }  

最新更新