XPath 和 Powershell - 默认命名空间



我有以下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 查询完全有效,但我尝试在 xml 中没有默认命名空间 xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 并且它工作正常。

我知道我必须将默认命名空间映射到 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

*:除了后代元素中的显式前缀用法,或在后代级别(在更本地的作用域中)声明的其他默认命名空间。

相关内容

  • 没有找到相关文章