jeudi 1 décembre 2011

Manipulation XML en PowerShell

Manipuler XML en PowerShell
PowerShell est capable de lire et de manipuler facilement du contenu XML.
J'ai d'ailleurs trouvé deux excellentes références sur le sujet.
Ou encore:

Comment sauver un HashTable en XML
Il est possible de sauver le contenu d'un HashTable en une seule ligne de code... c'est assez bleufant.
Dans l'exemple suivant,  $list est un HashTable contenant des autres HashTables... voici le contenu de la liste
>>> $__list
Name                           Value                                                                                                                                                                                 
----                           -----                                                                                                                                                                                   
5410439120722                  {ArtCode, EAN, NoteRef, Descr...}                                                                                                                                                       
5410439350358                  {ArtCode, EAN, NoteRef, Descr...}                                                                                                                                                       
5410439354202                  {ArtCode, EAN, NoteRef, Descr...}  

>>> $__list["5410439120722"]
Name                           Value                                                                                                                                                                                   
----                           -----                                                                                                                                                                                   
ArtCode                        BZ1933060080                                                                                                                                                                            
EAN                            5410439120722                                                                                                                                                                           
NoteRef                                                                                                                                                                                                                
Descr                          Vis à tête hex. 8.8 Din 933/934 M 6x 80 zingué                                                                                                                                          
TotalReceiptQty                12 

La sauvegarde se fait à l'aide de la commande suivante:
($__List.Values | convertTo-Xml).Save( "c:\test.xml" )

Et cela produit le résultat suivant:
<?xml version="1.0"?>
<Objects>
  <Object Type="System.Collections.Hashtable">
    <Property Name="Key" Type="System.String">ArtCode</Property>
    <Property Name="Value" Type="System.String">BZ1933060080</Property>
    <Property Name="Key" Type="System.String">EAN</Property>
    <Property Name="Value" Type="System.String">5410439120722</Property>
    <Property Name="Key" Type="System.String">NoteRef</Property>
    <Property Name="Value" Type="System.String" />
    <Property Name="Key" Type="System.String">Descr</Property>
    <Property Name="Value" Type="System.String">Vis à tête hex. 8.8 Din 933/934 M 6x 80 zingué  </Property>
    <Property Name="Key" Type="System.String">TotalReceiptQty</Property>
    <Property Name="Value" Type="System.Int32">12</Property>
  </Object>
  <Object Type="System.Collections.Hashtable">
    <Property Name="Key" Type="System.String">ArtCode</Property>
    <Property Name="Value" Type="System.String">BZ1094050063</Property>
    <Property Name="Key" Type="System.String">EAN</Property>
    <Property Name="Value" Type="System.String">5410439350358</Property>
    <Property Name="Key" Type="System.String">NoteRef</Property>
    <Property Name="Value" Type="System.String" />
    <Property Name="Key" Type="System.String">Descr</Property>
    <Property Name="Value" Type="System.String">Goupille fendue Din 94 * 5,0x 63 zingué  </Property>
    <Property Name="Key" Type="System.String">TotalReceiptQty</Property>
    <Property Name="Value" Type="System.Int32">12</Property>
  </Object>
  <Object Type="System.Collections.Hashtable">
    <Property Name="Key" Type="System.String">ArtCode</Property>
    <Property Name="Value" Type="System.String">BZ1021050015</Property>
    <Property Name="Key" Type="System.String">EAN</Property>
    <Property Name="Value" Type="System.String">5410439354202</Property>
    <Property Name="Key" Type="System.String">NoteRef</Property>
    <Property Name="Value" Type="System.String" />
    <Property Name="Key" Type="System.String">Descr</Property>
    <Property Name="Value" Type="System.String">Rondelle Din 9021 M  5 zingué (5,3/15/1,2)</Property>
    <Property Name="Key" Type="System.String">TotalReceiptQty</Property>
    <Property Name="Value" Type="System.Int32">12</Property>
  </Object>
</Objects>

Le rechargement de la HashTable
Par contre, de toute évidence, le rechargement sera une autre paire de manche.
Ainsi, les données sont rechargées à l'aide de
$xmldata = [xml](Get-Content c:\test.xml) 
Et tous les élement de la la première HashTable visible à l'aide de
$xmlData.Objects.Object[0].Property
Ce qui produit le résultat:
Name                                                                    Type                                                                    #text                                                                  
----                                                                    ----                                                                    -----                                                                  
Key                                                                     System.String                                                           ArtCode                                                                
Value                                                                   System.String                                                           BZ1933060080                                                           
Key                                                                     System.String                                                           EAN                                                                    
Value                                                                   System.String                                                           5410439120722                                                          
Key                                                                     System.String                                                           NoteRef                                                                
Value                                                                   System.String                                                                                                                                  
Key                                                                     System.String                                                           Descr                                                                  
Value                                                                   System.String                                                           Vis à tête hex. 8.8 Din 933/934 M 6x 80 zingué                      
Key                                                                     System.String                                                           TotalReceiptQty                                                        
Value                                                                   System.Int32                                                            12   

Recomposer les paires Clé-Valeur
Pour accéder le contenu des paire clé-valeur de la première HashTable, il faut exécute le code
$xmlData.Objects.Object[0].Property | foreach-object{ if( $_.Name -eq "Key" ){ $KeyName = $_."#Text" } else { $value = $_."#Text"; "$KeyName=$value" }  }

Ce qui produit le résultat:
ArtCode=BZ1933060080
EAN=5410439120722
NoteRef=
Descr=Vis à tête hex. 8.8 Din 933/934 M 6x 80 zingué  
TotalReceiptQty=12

Recomposer une HashTable devient alors assez élémentaire
$ht = @{}
$xmlData.Objects.Object[0].Property | foreach-object{ if( $_.Name -eq "Key" ){ $KeyName = $_."#Text" } else { $value = $_."#Text"; $ht.Add( $KeyName, $value) }  }

L'affichage de la HashTable à l'aide de la commande
$ht
produit le résultat suivant:
Name                           Value                                                                                                                                                                                   
----                           -----                                                                                                                                                                                   
ArtCode                        BZ1933060080                                                                                                                                                                            
EAN                            5410439120722                                                                                                                                                                           
NoteRef                                                                                                                                                                                                                
Descr                          Vis à tête hex. 8.8 Din 933/934 M 6x 80 zingué                                                                                                                                       
TotalReceiptQty                12     

Rechargement de ma liste de HashTable
Sur base du code présenté juste avant, une liste de HashTable telle que présentée en début d'article (une HashTable de HashTable) se recharge comme suit:
$__list = @{}       
       
foreach( $hashTableNode in $xmlData.Objects.Object ) {
  $ht = @{}

   $hashTableNode.Property | foreach-object{ if( $_.Name -eq "Key" ){ $KeyName = $_."#Text" } else { $value = $_."#Text"; $ht.Add( $KeyName, $value) }  }
           
$__list.Add( $ht.EAN.Clone(), $ht.Clone() )

Aucun commentaire: