2015-04-21 147 views
5

我有以下的PowerShell功能:XPath和PowerShell的 - 默認命名空間

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

兩個嘗試返回任何結果,儘管XPath查詢perfectley有效,我已經沒有默認命名空間的xmlns =「HTTP嘗試:// schemas.microsoft.com/developer/msbuild/2003「在xml和它的工作正常。

據我所知,我必須將默認命名空間映射到一個URI,並使用它來查詢具有此映射的XML,但我似乎無法讓它工作。

如何使用默認命名空間查詢XML,我還沒有找到Google上可用的任何東西。

更新

工作代碼:

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

請顯示輸入的XML文檔。 –

回答

3

我無法不看實際的XML文檔(或它的代表性樣本)100%肯定。無論如何,這通常是由於xpath中缺少名稱空間前綴使用。

請注意,在默認命名空間的情況下,不僅聲明默認命名空間的元素,而且所有的後代都被視爲在同一個命名空間*中。我建議嘗試以下XPath:

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

*:除了在後代元素明確的前綴使用,或以後代級別上聲明其他默認命名空間(在更多的本地範圍內)。

+0

謝謝,你是對的,我需要在每個元素前加上命名空間。這似乎有點奇怪,因爲它的_default_命名空間。 – user1359448