1
votes

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 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!


2 commentaires

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


3 Réponses :


1
votes

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"


4 commentaires

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



2
votes

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.

    • Les noms de préfixe ne doivent pas nécessairement correspondre à ceux de l'original, tant qu'ils sont cohérents avec l'argument -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.

    • En aparté: ce besoin d'accéder à .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 .


0 commentaires

1
votes

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'


3 commentaires

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 - 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!