2015-04-21 10 views
5

ich folgende Powershell-Funktion haben:XPath und Powershell - Standard-Namespace

function getProjReferences([string] $projFile) { 

    # Returns nothing 
    $Namespace = @{ ns = "http://schemas.microsoft.com/developer/msbuild/2003"; }; 
    $Xml = Select-Xml -Path $projFile -Namespace $Namespace -XPath "//ns:Project/ItemGroup/Reference" 

    # Returns nothing 
    [xml] $xml = Get-Content -Path $projFile 
    [System.Xml.XmlNamespaceManager] $nsMgr = New-Object -TypeName System.Xml.XmlNamespaceManager($xml.NameTable) 
    $nsMgr.AddNamespace("ns", "http://schemas.microsoft.com/developer/msbuild/2003"); 
    [XmlNode] $nodes = $xml.SelectNodes("/ns:Project/ItemGroup/Reference", $nsMgr); 
} 

beide Versuche nichts zurückgeben, obwohl die XPath-Abfrage perfectley gültig ist, ich ohne den Standard-Namespace xmlns versucht haben = "http: // schemas.microsoft.com/developer/msbuild/2003 "in der XML und es funktioniert gut.

Ich verstehe, dass ich den Standard-Namespace zu einem URI zuordnen muss und damit das XML mit diesem Mapping abfragen, aber ich kann nicht scheinen, es zu funktionieren.

Wie frage ich die XML mit einem Standard-Namespace ?, Ich habe noch nichts brauchbares auf Google finden.

aktualisiert

Arbeitscode:

function getProjReferences([string] $projFile) { 

    [xml] $xml = Get-Content -Path $projFile 
    [System.Xml.XmlNamespaceManager] $nsMgr = New-Object -TypeName System.Xml.XmlNamespaceManager($xml.NameTable) 
    $nsMgr.AddNamespace("ns", "http://schemas.microsoft.com/developer/msbuild/2003"); 
    [XmlNode] $nodes = $xml.SelectNodes("/ns:Project/ns:ItemGroup/ns:Reference", $nsMgr); 
} 
+0

Bitte zeigen Sie das Eingabe-XML-Dokument an. –

Antwort

3

Ich kann nicht zu 100% sicher sein, ohne auf dem tatsächlichen XML-Dokument suchen (oder repräsentative Stichprobe davon). Wie auch immer, es liegt oft daran, dass der Namespace-Präfix nicht im XPath verwendet wird.

Beachten Sie, dass im Falle des Standardnamespace nicht nur das Element, für das der Standardnamespace deklariert ist, sondern auch alle untergeordneten Elemente desselben Namensbereichs * berücksichtigt werden. Ich würde vorschlagen, die folgende XPath, um zu versuchen:

/ns:Project/ns:ItemGroup/ns:Reference 

*: außer einem ausdrücklichen Präfix Verwendung in dem Nachkommen Elemente oder eine anderen Standard-Namespace in Nachkommen Ebene (in einem lokalen Bereich) erklärt.

+0

Danke, Sie haben Recht, ich musste jedem Element den Namespace voranstellen. Es scheint nur ein wenig seltsam, da es der Namensraum _default_ ist. – user1359448