2014-04-15 11 views
10

Ich möchte mit PowerShell eine Liste aller Projektreferenzen in meiner csproj-Datei abrufen. Zur Zeit habe ich den folgenden Ansatz:PowerShell XML SelectNodes kann XPath nicht verarbeiten

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

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

Allerdings ist das Skript nicht ausgegeben nichts, obwohl es sicherlich ProjectReference Elemente in der angegebenen csproj Datei ist. Die folgende funktioniert:

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

Aber ich XPath müssen auch später + es gibt Fehler für jede ItemGroup, die keine ProjectReference enthält - so wie XPath Arbeit mit der SelectNodes Funktion zu machen?

XML-Beispiel (im Wesentlichen jede VS csproj Datei mit Projektreferenzen tun wird):

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

Würden Sie in der Lage sein, eine Probe XML-Dokument hinzufügen, die das beschriebene Verhalten liefert? – vonPryz

Antwort

17

Das Problem ist die http://schemas.microsoft.com/developer/msbuild/2003 Namespace. Sie müssen diesen Namespace in Ihren XPath-Ausdrücken berücksichtigen, da sich Elementnamen ohne Präfix in XPath auf Elemente beziehen, die in einem Namespace nicht sind.

[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 
} 

(angepasst von this answer)