Come leggere o: xml con PowerShell?

Nov 05 2020

Ho il seguente file xml ma non so come leggerlo con Powershell, qualcuno può aiutarmi? Grazie!

Devo ottenere il valore dell'URL da 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>

Grazie in anticipo!

Risposte

2 mklement0 Nov 05 2020 at 14:56

Puoi trarre vantaggio dal fatto che il comodo adattamento basato sulla proprietà di PowerShell del DOM XML ignora essenzialmente gli spazi dei nomi, consentendo semplicemente di eseguire il drill-down dell'elemento di interesse tramite i nomi degli elementi non qualificati:

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

Al contrario, il Select-Xmlcmdlet basato su XPath è compatibile con lo spazio dei nomi e quindi richiede una gestione esplicita dello spazio dei nomi o una soluzione alternativa tramite la local-name()funzione, come mostrato nella risposta di Mathias R. Jessen .

Se si desidera utilizzare una corretta gestione dello spazio dei nomi, che in definitiva è più robusta, ma non sempre necessaria, utilizzare quanto segue:

(
  Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
  • Notare la necessità di passare una tabella hash ( @{ ... }) che dichiari i prefissi dello spazio dei nomi e gli URL utilizzati, che è il prerequisito per poter utilizzare i prefissi ( o:, in questo caso) nella query XPath.

    • I nomi dei prefissi non devono necessariamente corrispondere a quelli dell'originale, purché siano coerenti con l' -Namespaceargomento e siano mappati agli URL originali.
  • Select-Xmlrestituisce oggetti wrapper attorno alle System.Xml.XmlNodeistanze corrispondenti , quindi .Nodeè necessario per accedere a queste ultime, .InnerTextquindi restituisce il contenuto di testo del nodo.

    • Per inciso: questa necessità di accesso .Nodeè scomoda, poiché il caso d'uso tipico è quello di preoccuparsi XmlNodedell'unico; Il suggerimento di GitHub n. 13669 cerca di alleviare il
      -Rawproblema tramite un interruttore che restituisce XmlNodedirettamente le istanze.
1 MathiasR.Jessen Nov 05 2020 at 14:43

Potresti usare 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 ora conterrà la stringa "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"

1 AdminOfThings Nov 05 2020 at 15:00

Dato che stai restituendo json, puoi semplicemente convertire da json a un oggetto 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'