mardi 14 juin 2016

Utiliser Xml dans PowerShell

Nous allons voir dans cet article les bases permettant de gérer un fichier Xml avec Windows PowerShell. Dans les exemples suivants, nous allons lire le fichier Xml. Le premier exemple utilise la méthode de l'index pour lire les données. Le second exemple utilise la commande foreach.

Fichier XML


En premier lieu, nous allons créer un fichier texte "livres.xml". Ce fichier doit contenir les lignes de données suivantes :

<?xml version="1.0" standalone="yes"?>

<Livres>

  <Manga Edition="Kana">
    <Titre>Jumbor</Titre>
    <Numero>1</Numero>
  </Manga>

  <Manga Edition="Ki-oon">
    <Titre>Ubel Blatt</Titre>
    <Numero>1</Numero>
  </Manga>

</Livres>

Une fois le fichier enregistré (dans c:\temp par exemple), nous allons utiliser PowerShell pour le lire.

Exemple 1


#Lecture du fichier.
[xml]$xml = get-content (“c:\temp\livres.xml”)

#Je récupéré dans $Livres les données entre la balise <Livres> et </Livres>.
$Livres = $xml.Livres

#Puis j'affiche mes données.
Write-Host $Livres.Manga[0].Edition
Write-Host $Livres.Manga[0].Titre
Write-Host $Livres.Manga[0].Numero

Ici je suis obligé d'indexer $Livre.Manga[] car dans mon fichier Xml, j'ai plusieurs fois la balise <Manga>. Si la balise n'était présente qu'une seul fois, j'aurais dû écrire Write-Host $Livres.Manga.Edition (sans l'indexation). Ceci viens de l’interprétation de la commande Get-Content. Lorsqu'il rencontre plusieurs fois une même balise, il la traduit sous la forme d'un tableau. Pour éviter les problèmes d'écriture suivant le nombre d’élément répétable présent dans un document Xml, il vaut mieux passer par un Foreach :

Exemple 2


#Lecture du fichier.
[xml]$xml = get-content (“c:\temp\livres.xml”)

#Je récupéré dans $Livres les données entre la balise <Livres> et </Livres>.
$Livres = $xml.Livres

#Puis j'affiche mes données.
foreach ($m in $Livres.Manga)
 {
   Write-Host $m.Edition
   Write-Host $m.Titre
   Write-Host $m.Numero
 }

Ici, la commande foreach fonctionne quelques soit le nombre de balise <Manga> présent dans le document Xml.