我有以下代码从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
而不需要名称空间前缀/通过设置默认名称空间?
答案 0 :(得分:2)
从我所知道的,默认命名空间的概念,无需用它为节点名添加前缀:
适用于XML 文档
不是否适用于 XPath表达式。
换句话说:
如果文档/元素子树沿<foo xmlns='http://example.org'>
行声明默认命名空间,则该元素和所有未使用命名空间前缀的后代在该默认命名空间中隐式 。
相比之下,在 XPath表达式的上下文中引用此类节点需要您:
ns
)ns:div
)上面的摘录来自the documentation(强调补充):
如果XPath表达式不包含前缀,则假定名称空间统一资源标识符(URI)是空名称空间。 如果您的XML包含默认命名空间,您仍必须向XmlNamespaceManager添加前缀和命名空间URI ;否则,不会选择任何节点。