2015-06-29 110 views
0

我使用PowerShell来解析C#项目文件,这是一个标准的XML文件:Powershell:[xml] .SelectNodes不返回预期结果?

<?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> 

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

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 

任何问题我的计划或设想? 谢谢!

+1

'$ xml.SelectNodes( “//任何:CodeAnalysisRules”,$ NS)' – PetSerAl

回答

2

您的XML有默认命名空间在文档元素级别声明。请注意,除非另有说明,后代元素隐含地继承祖先默认名称空间。这意味着,你的目标选择CodeAnalysisRules元素是在默认的命名空间,这就是为什么你需要使用注册的前缀Any选择元素,它由@PetSerAl在评论中提到:

$nodes = $xml.SelectNodes("//Any:CodeAnalysisRules",$ns)