Настройка пространства имен по умолчанию для менеджера пространства имен в PowerShell - PullRequest
0 голосов
/ 25 мая 2018

У меня есть следующий код, который правильно выбирает ссылки на свойства AD из документации MSDN :

$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:), что документация подразумевает, может быть сделано путем добавления пространства имен с префиксом 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 голосов
/ 26 мая 2018

Из того, что я могу сказать, концепция пространства имен по умолчанию в том смысле, что нет необходимости добавлять к нему имена узлов :

  • , применима к XML документы

  • не не применяются к выражениям XPath .

Inдругими словами:

  • Если поддерево документа / элемента объявляет пространства имен по умолчанию вдоль строк <foo xmlns='http://example.org'>, этот элемент и все потомки, не использующие префикс пространства имен, равны неявно в этом пространстве имен по умолчанию.

  • Напротив, для ссылки на такие узлы в контексте выражения XPath требуется, чтобы вы:

    • выберите префикс, чтобы сопоставить URI пространства имен документа по умолчанию с (ns в вашем примере)
    • явно использовать этот префикс для сопоставления узлов в пространстве имен по умолчанию (например, ns:div)

Вышеизложенное подтверждается следующей выдержкой из documentation (выделение выделено):

Если выражение XPath не содержит префикса, предполагается, что универсальный идентификатор ресурса (URI) пространства имен является пустым пространством имен, Если ваш XML включает пространство имен по умолчанию, вы все равно должны добавить префикс и URI пространства имен в XmlNamespaceManager ;в противном случае узлы не будут выбраны.

...