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() )