2014-04-15 16 views
10

Chcę uzyskać listę wszystkich odniesień projektu w moim pliku csproj przy użyciu PowerShell. Obecnie mam następujące podejście:PowerShell XML SelectNodes nie przetwarza XPath

[xml]$csproj = Get-Content MyProject.csproj 

$refs = $csproj.SelectNodes("//ProjectReference") 
foreach($ref in $refs) { 
    # Later on output more useful information 
    Write-Host $ref.Name 
} 

Jednak skrypt nie emituje nic, choć z pewnością są elementami ProjectReference w danym pliku csproj. Poniższy pracuje:

[xml]$csproj = Get-Content MyProject.csproj 
foreach($l in $csproj.Project.ItemGroup.ProjectReference) { Write-Host $l.Include } 

Ale muszę XPath później także + wyprowadza błędów dla każdego ItemGroup który nie zawiera ProjectReference - tak jak uczynić pracę XPath przy użyciu funkcji SelectNodes?

XML próbki (w zasadzie każdy plik csproj VS odniesieniami projektowych zrobi):

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup></ItemGroup> 
    <ItemGroup> 
    <ProjectReference Include="Text"></ProjectReference> 
    <ProjectReference Include="Text2"></ProjectReference> 
    </ItemGroup> 
    <ItemGroup></ItemGroup> 
</Project> 
+0

Byłbyś w stanie dodać przykładowy dokument XML, który zapewnia opisanego zachowania? – vonPryz

Odpowiedz

17

Problemem jest nazw http://schemas.microsoft.com/developer/msbuild/2003. Trzeba wziąć pod uwagę tę przestrzeń nazw w wyrażeniach XPath, ponieważ niepoprawione nazwy elementów w XPath odnoszą się do elementów, które są , a nie w przestrzeni nazw.

[xml]$csproj = Get-Content MyProject.csproj 
$ns = new-object Xml.XmlNamespaceManager $csproj.NameTable 
$ns.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003") 

$refs = $csproj.SelectNodes("//msb:ProjectReference", $ns) 
foreach($ref in $refs) { 
    # Later on output more useful information 
    Write-Host $ref.Name 
} 

(zaadaptowane z this answer)