Come leggere o: xml con PowerShell?
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
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.
- I nomi dei prefissi non devono necessariamente corrispondere a quelli dell'originale, purché siano coerenti con l'
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 preoccuparsiXmlNodedell'unico; Il suggerimento di GitHub n. 13669 cerca di alleviare il
-Rawproblema tramite un interruttore che restituisceXmlNodedirettamente le istanze.
- Per inciso: questa necessità di accesso
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"
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'