2015-06-29 116 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)