Comment lire o: xml avec PowerShell?
J'ai le fichier XML suivant mais je ne sais pas comment le lire avec Powershell, n'importe qui peut m'aider? Merci!
J'ai besoin d'obtenir la valeur URL de 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>
Merci d'avance!
Réponses
Vous pouvez tirer parti du fait que l' adaptation pratique et basée sur les propriétés de PowerShell du DOM XML ignore essentiellement les espaces de noms, ce qui vous permet simplement d'explorer l'élément d'intérêt par les noms d'élément non qualifiés:
([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url
En revanche, l' Select-Xmlapplet de commande XPath prend en charge les espaces de noms et nécessite donc une gestion explicite des espaces de noms - ou une solution de contournement via la local-name()fonction, comme indiqué dans la réponse de Mathias R. Jessen .
Si vous souhaitez utiliser une gestion appropriée des espaces de noms - qui est finalement plus robuste, mais pas toujours nécessaire - utilisez ce qui suit:
(
Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
Notez la nécessité de passer une table de hachage (
@{ ... }) qui déclare les préfixes d'espace de noms et les URL utilisés, ce qui est la condition préalable pour pouvoir utiliser les préfixes (o:, dans ce cas) dans la requête XPath.- Les noms de préfixe ne doivent pas nécessairement correspondre à ceux de l'original, tant qu'ils sont cohérents avec l'
-Namespaceargument et sont mappés aux URL d'origine.
- Les noms de préfixe ne doivent pas nécessairement correspondre à ceux de l'original, tant qu'ils sont cohérents avec l'
Select-Xmlrenvoie des objets wrapper autour des System.Xml.XmlNodeinstances correspondantes , il.Nodeest donc nécessaire d'accéder à ces dernières,.InnerTextpuis renvoie le contenu textuel du nœud.- En passant: ce besoin d'accès
.Noden'est pas pratique, car le cas d'utilisation typique est de se soucier duXmlNodeseul; La suggestion GitHub # 13669 cherche à atténuer la douleur via un
-Rawcommutateur qui renvoieXmlNodedirectement les instances.
- En passant: ce besoin d'accès
Vous pouvez utiliser 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 contiendra maintenant la chaîne "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"
Puisque vous renvoyez json, vous pouvez simplement convertir de json en objet 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'