Como ler o: xml com o PowerShell?

Nov 05 2020

Tenho o seguinte arquivo xml, mas não sei como lê-lo com o Powershell. Alguém pode ajudar? Obrigado!

Preciso obter o valor do url do 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>

Desde já, obrigado!

Respostas

2 mklement0 Nov 05 2020 at 14:56

Você pode tirar vantagem do fato de que a adaptação conveniente e baseada em propriedade do PowerShell do XML DOM essencialmente ignora os namespaces, permitindo que você simplesmente faça uma busca detalhada no elemento de interesse pelos nomes de elemento não qualificados:

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

Por outro lado, a baseada em XPath Select-Xmlcmdlet é namespace-aware, e, portanto, requer um tratamento namespace explícito - ou uma solução através da local-name()função, como mostra a resposta de Mathias R. Jessen .

Se você quiser usar o tratamento adequado de namespace - o que é mais robusto, mas nem sempre necessário - use o seguinte:

(
  Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
  • Observe a necessidade de passar um hashtable ( @{ ... }) que declare os prefixos de namespace e URLs usados, que é o pré-requisito para poder usar os prefixos ( o:neste caso) na consulta XPath.

    • Os nomes de prefixo não precisam corresponder aos do original, desde que sejam consistentes com o -Namespaceargumento e sejam mapeados para os URLs originais.
  • Select-Xmlretorna objetos de invólucro em torno das System.Xml.XmlNodeinstâncias correspondidas , portanto, .Nodeé necessário para acessar o último e, em .InnerTextseguida, retorna o conteúdo de texto do nó.

    • Como um aparte: essa necessidade de acesso .Nodeé inconveniente, pois o caso de uso típico é se preocupar com o XmlNodeúnico; A sugestão # 13669 do GitHub visa aliviar a dor por meio de um
      -Rawswitch que retorna as XmlNodeinstâncias diretamente.
1 MathiasR.Jessen Nov 05 2020 at 14:43

Você pode usar 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 agora conterá a string "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"

1 AdminOfThings Nov 05 2020 at 15:00

Como você está retornando json, você pode apenas converter de json em um objeto 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'