0

我正在尝试从 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")。为什么它可以找到子节点Private?

4

1 回答 1

2

在向@Richard question 提供错误信息后,我意识到 XPath 一定有问题。简单的 XPath 有什么问题?我试图获取直接子节点。然后尝试了经典的调试技术,将输出写入控制台,输出父节点的InnerXml。在输出中,我注意到 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)) 
            }
        }  
于 2012-11-09T10:30:45.337 回答