2015-04-21 6 views
5

Ho la seguente funzione PowerShell:XPath e PowerShell - namespace predefinito

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); 
} 

Entrambi i tentativi di ritorno nulla, anche se la query XPath è perfectley valida, ho provato senza il xmlns namespace default = "http: // schemas.microsoft.com/developer/msbuild/2003 "in xml e funziona correttamente.

Capisco che devo mappare lo spazio dei nomi predefinito su un URI e usarlo per interrogare l'XML con questa mappatura, ma non riesco a farlo funzionare.

Come faccio a interrogare l'XML con uno spazio dei nomi predefinito ?, Non ho ancora trovato nulla di utile su Google.

Aggiornamento

codice di lavoro:

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

Mostrare il documento XML di input. –

risposta

3

Non posso essere sicuro al 100% senza guardare il documento XML effettiva (o campione rappresentativo di esso). In ogni caso, è spesso dovuto alla mancanza dell'uso del prefisso dello spazio dei nomi in xpath.

Si noti che nel caso dello spazio dei nomi predefinito, non solo l'elemento in cui è stato dichiarato lo spazio dei nomi predefinito, ma anche tutti i suoi discendenti sono considerati nello stesso spazio dei nomi *. Io suggerirei di provare la seguente XPath:

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

*: ad eccezione di utilizzo del prefisso esplicito l'elemento discendente, o altro spazio dei nomi predefinito dichiarato a livello discendente (in un ambito più locale).

+0

Grazie, hai ragione, dovevo prefisso ogni elemento con lo spazio dei nomi. Sembra un po 'strano, dato che è lo spazio dei nomi _default_. – user1359448