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.
- Chapitre 14: Xml sur PowerShell.com
- XML Part 2: Write, Add, Change Xml Data sur PowerShell.com
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:
Enregistrer un commentaire