Xml XPath和Powershell-默认名称空间

Xml XPath和Powershell-默认名称空间,xml,powershell,xpath,Xml,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:Pro

我具有以下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查询是有效的,但我尝试了不使用默认名称空间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);
}

如果不查看实际的XML文档(或其代表性示例),我无法100%确定。无论如何,这通常是由于xpath中缺少名称空间前缀的使用

请注意,在默认名称空间的情况下,不仅声明默认名称空间的元素,而且它的所有子元素都被视为在同一名称空间中*。我建议尝试以下xpath:

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

*:除了在子体元素中使用显式前缀,或在子体级别(在更局部的范围内)声明的其他默认名称空间之外。

请显示输入XML文档。谢谢,你说得对,我需要在每个元素前面加上名称空间。这似乎有点奇怪,因为它是默认名称空间。