我正在尝试从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))
}
}