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 d'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!
3 Réponses :
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 désormais la chaîne "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"
Salut @Mathias R. Jessen, Merci pour votre réponse rapide. Cependant, Select-XML
ne semble pas fonctionner de mon côté. Je ne parviens toujours pas à obtenir la valeur de cette manière. Y a-t-il quelque chose que j'ai manqué?
@WayneYang Supprimez l'appel ConvertTo-Xml
Merci, j'ai essayé de supprimer ConvertTo-Xml
, mais j'ai obtenu cette erreur: Select-Xml: Impossible de convertir la valeur "{" o: OfficeConfig ": {" @ xmlns: o ":" urn: schemas-microsoft-com: of fice : office "," o: serv ices ": {" o: service ": {" @o: name ":" GetFedera tionProvider "," o: url ":" odc.officeapps.li ve .com / odc / emailhrd / getfederationprovide r "}}}}" pour taper "System.Xml.XmlDocument". Erreur: "Le nœud spécifié ne peut pas être inséré en tant qu'enfant valide de ce nœud, car le nœud spécifié est du type incorrect."
@WayneYang C'est JSON, pas XML. Veuillez mettre à jour votre message d'origine avec ce que vous faites réellement
Vous pouvez tirer parti du fait que l' adaptation pratique et basée sur les propriétés du DOM XML de PowerShell ignore essentiellement les espaces de noms, ce qui vous permet simplement de rechercher l'élément d'intérêt par les noms d'élément non qualifiés:
( Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' } ).Node.InnerText
En revanche, l'applet de commande Select-Xml
basée Select-Xml
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 fonction local-name()
, 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:
([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url
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.
-Namespace
et sont mappés aux URL d'origine. Select-Xml
renvoie des objets wrapper autour des instances System.Xml.XmlNode
correspondantes, donc .Node
est requis pour accéder à ces dernières, et .InnerText
renvoie ensuite le contenu textuel du nœud.
.Node
n'est pas pratique, car le cas d'utilisation typique est de ne se soucier que du XmlNode
; La suggestion GitHub # 13669 cherche à soulager la douleur via un-Raw
qui renvoie directement les instances XmlNode
.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'
Bien que vous ayez probablement raison (bien que je soupçonne qu'un appel Invoke-RestMethod
pourrait remplacer le combo Invoke-WebRequest
/ ConvertFrom-Json
), le problème est que la question concerne décidément autre chose - veuillez voir mon commentaire sur la question.
@WayneYang: S'il vous plaît, s'il vous plaît poser une nouvelle question et demander AdminOfThings pour vous aider là - bas. Répondre à une question différente de celle posée ne fera que créer de la confusion pour les futurs lecteurs.
Je l'ai compris. Merci @AdminOfThings!
Il semble que nous ayons un problème XY : vous posez des questions sur XML , via un fichier , en pensant que vous devez d'abord convertir la réponse d'un service Web en XML. Cependant, il semble que la réponse soit JSON, que vous devriez traiter comme tel, et
Invoke-RestMethod
transformerait directement en un graphe d'objets (ce que la réponse de @AdminOfThings fait indirectement). Je vous suggère d'accepter ici une réponse basée sur la question posée et de créer une nouvelle question qui traite de votre problème réel.Oui, j'ai trouvé que si c'est un fichier XML, ça marche ... Merci @ mklement0