在PowerShell中为命名空间管理器设置默认命名空间

时间:2018-05-25 13:31:56

标签: powershell xpath xml-namespaces powershell-v5.0

我有以下代码从MSDN documentation正确获取AD属性链接:

$uri = 'https://msdn.microsoft.com/en-us/library/ms675090(v=vs.85).aspx' #lists all AD attributes
$results = [xml](Invoke-RestMethod -Method Get -Uri $uri -UseBasicParsing -UseDefaultCredentials)
[System.Xml.XmlNamespaceManager] $nsMgr = New-Object -TypeName System.Xml.XmlNamespaceManager($results.NameTable)
$nsMgr.AddNamespace('ns','http://www.w3.org/1999/xhtml')
$results.SelectNodes("/ns:html/ns:body/ns:div[@id = 'page']/ns:div[@id = 'body']/ns:div[@id = 'content']/ns:div[@class = 'topic']/ns:div[@id = 'mainSection']/ns:dl/ns:dd/ns:a/@href",$nsMgr)

最初我希望避免添加名称空间前缀(ns:),the documentation暗示可以通过添加前缀为string.Empty的名称空间来完成。这似乎在设置默认命名空间方面起作用;但是SelectNodes没有使用此默认值。

$uri = 'https://msdn.microsoft.com/en-us/library/ms675090(v=vs.85).aspx' #lists all AD attributes
$results = [xml](Invoke-RestMethod -Method Get -Uri $uri -UseBasicParsing -UseDefaultCredentials)
[System.Xml.XmlNamespaceManager] $nsMgr = New-Object -TypeName System.Xml.XmlNamespaceManager($results.NameTable)
#$nsMgr.AddNamespace('ns','http://www.w3.org/1999/xhtml') #tried with and without this line
$nsMgr.AddNamespace([string]::Empty,'http://www.w3.org/1999/xhtml')
$nsMgr.DefaultNamespace #returns http://www.w3.org/1999/xhtml as hoped
$results.SelectNodes("/html",$nsMgr).Name #should return `html` but doesn't (though works if we register the prefix and use /ns:html)

问题:

有没有办法让PowerShell使用SelectNodes而不需要名称空间前缀/通过设置默认名称空间?

1 个答案:

答案 0 :(得分:2)

从我所知道的,默认命名空间的概念,无需用它为节点名添加前缀

  • 适用于XML 文档

  • 是否适用于 XPath表达式

换句话说:

  • 如果文档/元素子树沿<foo xmlns='http://example.org'>行声明默认命名空间,则该元素和所有未使用命名空间前缀的后代在该默认命名空间中隐式

  • 相比之下,在 XPath表达式的上下文中引用此类节点需要您:

    • 选择一个前缀,将文档的默认名称空间URI映射到(示例中为ns
    • 明确使用该前缀来匹配默认命名空间中的节点(例如ns:div

上面的摘录来自the documentation(强调补充):

  

如果XPath表达式不包含前缀,则假定名称空间统一资源标识符(URI)是名称空间。 如果您的XML包含默认命名空间,您仍必须向XmlNamespaceManager添加前缀和命名空间URI ;否则,不会选择任何节点。