Abonnement à ma liste de contacts

Etoiles inactivesEtoiles inactivesEtoiles inactivesEtoiles inactivesEtoiles inactives
 

Dans ce premier article un peu technique, je vous propose de découvrir comment générer des fichiers XML en ligne de commande sous Windows à l’aide de PowerShell. L’objectif est de créer une structure hiérarchisée que nous pourrons ensuite manipuler facilement pour stocker et organiser nos informations.

Une structure hiérarchique XML pour nos données

L’approche que je vais vous présenter repose d’abord sur la création d’un squelette XML, c’est-à-dire une architecture vide, mais déjà structurée. Cette structure contient différents nœuds, qui représentent les éléments clés de notre arborescence. Chaque nœud peut contenir des sous-nœuds (ou "éléments fils") et pourra ainsi évoluer selon nos besoins.

L’intérêt principal de cette hiérarchie est de pouvoir accéder facilement à chaque élément par son chemin d’accès. En identifiant précisément un nœud dans la structure, il devient simple d’ajouter ou de modifier une information.

Une fiche XML vierge comme point de départ

Pour faciliter la manipulation future de nos fichiers, j’ai choisi de commencer par générer une fiche XML vierge. Cette fiche inclura déjà toutes les catégories principales que je souhaite structurer. Elle servira de base stable pour la suite de nos opérations.

Je vous propose donc un premier script PowerShell qui va permettre de créer ce fichier XML vide. Il générera la hiérarchie de base, prête à accueillir des données. L’un des avantages de cette méthode est que, connaissant à l’avance la structure complète de mon fichier, je peux directement intégrer tous les nœuds de niveau 1 et de niveau 2, qui resteront fixes dans le temps – du moins, pour l’instant.

Une approche évolutive et maîtrisée

Actuellement, au moment où je rédige ces lignes, je suis en attente de validation définitive de cette architecture. C’est pourquoi les exemples que je vais vous présenter ici pourraient différer légèrement de ceux utilisés en production. Néanmoins, cela ne remet pas en cause l’intérêt pédagogique de cette démonstration.

En partant du principe que cette structure ne changera plus, il devient possible dans les prochains articles de manipuler ce fichier XML directement en ligne de commande : sélectionner un nœud précis, ajouter ou supprimer un élément, ou encore le modifier. C’est précisément pour cela que j’ai opté pour cette méthode : elle rend les mises à jour ciblées simples et efficaces.

Le script PowerShell

Voici un extrait du script PowerShell que je vous propose. Vous remarquerez notamment que les lignes 25, 29 et 50 sont celles qui créent les nœuds de niveau 1. Chacun de ces groupes de lignes est suivi par la création d’éléments fils.

Dans chaque bloc, la commande CreateElement permet de générer un nœud enfant selon un nom défini en paramètre. Grâce à cette commande, une structure XML hiérarchique se construit progressivement, respectant le modèle que nous avons défini.

Lecture commentée du script PowerShell de génération XML

Ce script PowerShell permet de créer un fichier XML structuré, représentant une fiche technique ou documentaire. Il crée des nœuds hiérarchisés correspondant à différentes catégories d'information.

Levée de la politique de sécurité PowerShell

# Il faut commencer par lever la sécurité !

Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force

Avant d'exécuter un script PowerShell, il est parfois nécessaire de modifier la politique de sécurité pour autoriser l'exécution de scripts non signés. Cette ligne le fait de manière temporaire pour l'utilisateur courant.

Initialisation et lecture du fichier modèle

$d = [xml] "<unmateriel></unmateriel>"
$pathToConfig="tmpl_mat.xml"
$xml = [xml](get-content $pathToConfig)
  • $d est un exemple d'initialisation XML avec une balise racine (<unmateriel>), probablement utilisé comme base.

  • Le script charge ensuite un fichier modèle tmpl_mat.xml dans la variable $xml, qui devient manipulable comme objet XML. Ce fichier deviendra mon template de ceréation de nouveaux fichiers XML. J'aurais pu le faire à la main, mais commes les outils windows me proposent un "environnement" tout faire pour le créer, pouquoi s'en priver ?...

Création de la structure XML

Chaque section ci-dessous suit la même logique :

  1. Création d’un élément avec .createElement().

  2. Insertion dans l’arborescence via .AppendChild().

Ajout du nœud "References" et ses enfants

$newnode=$xml.createElement("References")
$atag=$xml.getElementsByTagName("unElement").Item(0)
$atag.psbase.AppendChild($newnode)

Création du nœud principal References, rattaché à la racine <unElement>.

$newnode=$xml.createElement("reference1")
$atag=$xml.getElementsByTagName("Reference1").Item(0)
$atag.psbase.AppendChild($newnode)

Ajout de sous-nœuds à References : ici Reference1, Reference2, etc.

Ajout du nœud "notes"

$newnode=$xml.createElement("notes")
$atag=$xml.getElementsByTagName("unmateriel").Item(0)
$atag.psbase.AppendChild($newnode)

Ajoute un bloc "notes" à la racine du fichier.

Bloc "DocumentsFournisseurs"

Ce bloc regroupe les documents techniques fournis par les fournisseurs

$newnode=$xml.createElement("DocumentsFournisseurs")
$atag=$xml.getElementsByTagName("unmateriel").Item(0)
$atag.psbase.AppendChild($newnode)

$newnode=$xml.createElement("type1")
$atag=$xml.getElementsByTagName("DocumentsFournisseurs").Item(0)
$atag.psbase.AppendChild($newnode)

3.4 Bloc "PDE"

Ce bloc est particulièrement riche et contient de nombreux sous-nœuds représentant divers types de documents étatiques, procédures ou rapports : Type1, Type2, Type3, etc.

$newnode=$xml.createElement("PDE")
$atag=$xml.getElementsByTagName("unmateriel").Item(0)
$atag.psbase.AppendChild($newnode)

$newnode=$xml.createElement("Type1")
$atag=$xml.getElementsByTagName("PDE").Item(0)
$atag.psbase.AppendChild($newnode)

# etc. pour l'ensemble de chacun de mes types de documents à classer

Ce passage montre la logique hiérarchique : tous les éléments sont imbriqués dans le bloc principal PDE.

Bloc "GalerieImages"

$newnode=$xml.createElement("GalerieImages")
$atag=$xml.getElementsByTagName("unmateriel").Item(0)
$atag.psbase.AppendChild($newnode)

Un espace réservé à des fichiers image ou des galeries associées au matériel. Cette partie est présente pour l'instant mais sera amenée à évoluer. En effet, je vais travailler avec des images mappées, à cette heure, je n'ai encore pas bien toutes la hiérarchie de cette partie en tête !

Affichage (optionnel) et sauvegarde

$xml.psbase.OuterXml

 Affiche le contenu XML généré (utile pour déboguer ou prévisualiser dans la console).

# Je suis obligé de placer le chemin absolu sinon il me l'enregistre dans mon home !
$xml.Save("c:\users\33651\temp\powershell\out.xml")

Enregistrement du fichier finalisé dans le chemin spécifié. L’utilisation d’un chemin absolu est ici recommandée pour éviter toute confusion sur le répertoire de travail courant.

 

 

 

Vous retrouverez ici tous mes articles explicatifs de mes concepts, mes résultats d'analyses techniques m'ayant permi d'aboutir à un fonctionnement de mes applicatifs très fonctionnel

Rapport sondage marche

Voici le rapport statistique du sondage (auquel vous pouvez toujours répondre) que j'ai lancé sur le sujet