Como ler o: xml com o PowerShell?
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
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.
- Os nomes de prefixo não precisam corresponder aos do original, desde que sejam consistentes com o
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 oXmlNodeúnico; A sugestão # 13669 do GitHub visa aliviar a dor por meio de um
-Rawswitch que retorna asXmlNodeinstâncias diretamente.
- Como um aparte: essa necessidade de acesso
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"
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'