我正在尝试从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”)。为什么它可以找到子节点私有?
答案 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))
}
}