Как читать o: xml с помощью PowerShell?

Nov 05 2020

У меня есть следующий XML-файл, но я не знаю, как его читать с помощью Powershell. Кто-нибудь может помочь? Благодаря!

Мне нужно получить значение URL-адреса от Powershell.

<o:OfficeConfig xmlns:o="urn:xxx:xxx:xxx">
<o:services>
<o:service o:name="xxxx">
<o:url>https://xxx.xxx</o:url>
</o:service>
</o:services>
</o:OfficeConfig>

Заранее спасибо!

Ответы

2 mklement0 Nov 05 2020 at 14:56

Вы можете воспользоваться тем фактом, что удобная адаптация XML DOM PowerShell на основе свойств по существу игнорирует пространства имен, позволяя вам просто перейти к интересующему элементу по неквалифицированным именам элементов:

([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url

В отличии от XPath базирующегося в Select-Xmlкомандлете является пространством имен известно, и , следовательно , требует четкой обработки пространства имен - или обходной путь через local-name()функцию, как показан в ответе Матиас Р. ЕССЕН в .

Если вы хотите использовать правильную обработку пространства имен - которая в конечном итоге более надежна, но не всегда необходима - используйте следующее:

(
  Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
  • Обратите внимание на необходимость передать hashtable ( @{ ... }), который объявляет используемые префиксы пространства имен и URL-адреса, что является предварительным условием для возможности использования префиксов ( o:в данном случае) в запросе XPath.

    • Имена префиксов могут не совпадать с оригинальными, если они согласуются с -Namespaceаргументом и сопоставлены с исходными URL-адресами.
  • Select-Xmlвозвращает объекты- оболочки вокруг совпавших System.Xml.XmlNodeэкземпляров, поэтому .Nodeтребуется доступ к последним, а .InnerTextзатем возвращает текстовое содержимое узла.

    • В стороне: эта потребность в доступе .Nodeнеудобна, поскольку типичный вариант использования - заботиться XmlNodeтолько о единственном; Предложение GitHub № 13669 направлено на облегчение боли с помощью
      -Rawпереключателя, который напрямую возвращает XmlNodeэкземпляры.
1 MathiasR.Jessen Nov 05 2020 at 14:43

Вы можете использовать Select-Xml:

$rawXml = @' <o:OfficeConfig xmlns:o="urn:schemas-microsoft-com:office:office"> <o:services> <o:service o:name="GetFederationProvider"> <o:url>https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider</o:url> </o:service> </o:services> </o:OfficeConfig> '@ $urlNode = $rawXml |Select-Xml -XPath '//*[local-name() = "url"]' |Select -Expand Node $url = $urlNode.innerText

$url теперь будет содержать строку "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"

1 AdminOfThings Nov 05 2020 at 15:00

Поскольку вы возвращаете json, вы можете просто преобразовать json в объект PowerShell:

$configServiceUrl = "https://officeclient.microsoft.com/config16processed?rs=en-us&build=16.0.7612" $headers = @{'Accept' = 'application/json'}
$getFederationProviderEndpoint = Invoke-WebRequest -Uri "$($configServiceUrl)&services=GetFederationProvider" -Headers $headers -Method GET

$obj = $getFederationProviderEndpoint.Content | ConvertFrom-Json
$obj.'o:officeconfig'.'o:services'.'o:service'.'o:url'