1

我正在使用 powershell 解析一个 C# 项目文件,它是一个标准的 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    <PropertyGroup>
        <ProjectType>Local</ProjectType>
    </PropertyGroup>
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <CodeAnalysisRules>-Microsoft.Design#CA2210;Microsoft</CodeAnalysisRules>
        <PlatformTarget>AnyCPU</PlatformTarget>
    </PropertyGroup>
</Project>

我希望使用“SelectNodes”功能选择“CodeAnalysisRules”标签内容:

function f($fileName)
{
    Write-Host "Parsing $fileName"
    [xml]$xml=Get-Content $fileName
    if([String]::IsNullOrEmpty($xml.Project.NamespaceURI))
    {
        write-Host "skip!" -ForegroundColor Yellow
    }
    else
    {
        [System.Xml.XmlNamespaceManager]$ns = $xml.NameTable
        $ns.AddNamespace("Any", $xml.DocumentElement.NamespaceURI)
        $ns
        $nodes = $xml.SelectNodes("//CodeAnalysisRules",$ns)
        $nodes.Count
    }
}
f d:\m.xml

我希望得到里面的字符串,但实际上我得到了:

Parsing d:\m.xml

xmlns
xml
Any
0

我的程序或假设有什么问题吗?谢谢!

4

1 回答 1

2

您的 XML在文档元素级别声明了默认命名空间。请注意,后代元素隐式继承祖先默认命名空间,除非另有说明。这意味着,CodeAnalysisRules您要选择的元素位于默认命名空间中,这就是您需要使用注册前缀Any来选择元素的原因,正如@PetSerAl在评论中提到的那样:

$nodes = $xml.SelectNodes("//Any:CodeAnalysisRules",$ns)
于 2015-06-29T04:29:53.673 回答