2015-06-29 2 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", $ нс) ' – PetSerAl

ответ

2

Ваш XML имеет пространство имен по умолчанию, объявленное на уровне элемента документа. Обратите внимание, что элементы-потомки наследуют пространство имен по умолчанию для предоков неявно, если не указано иное. Это означает, что CodeAnalysisRules элемента вы ориентируетесь, чтобы выбрать в пространстве имен по умолчанию, поэтому вам нужно использовать зарегистрированный префикс Any, чтобы выбрать элемент, как было упомянуто @PetSerAl в комментарии:

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

 Смежные вопросы

  • Нет связанных вопросов^_^