Important XML | Mise à jour d'un node

Plus d'informations
il y a 4 mois 3 jours - il y a 4 mois 3 jours #30205 par editorxx
Bonjour à tous je suis nouveau sur ce forum. :)

Je travail actuellement sur un chantier nécessitant la modification en masse de fichier .XML
Voici la structure de mon .XML :
<?xml version="1.0" encoding="utf-8"?>
<batch>
  <selectedNode>Injector</selectedNode>
  <storage>
    <base>XXXXXX</base>
  </storage>
  <documents>
    <document>
      <createdDate>2020-10-09</createdDate>
      <typeFile>PDF</typeFile>
      <href>ATTESTATION2020.pdf</href>
      <metas>
        <meta>
          <idField>C1</idField>
          <value>DUPONT</value>
        </meta>
      </metas>
    </document>
    <document>
      <createdDate>2020-10-09</createdDate>
      <typeFile>PDF</typeFile>
      <href>ATTESTATION2019.pdf</href>
      <metas>
        <meta>
          <idField>C1</idField>
          <value>FRITE</value>
        </meta>
      </metas>
    </document>
  </documents>
</batch>

Le fichier .XML peut contenir plusieurs balises DOCUMENT qui contienne plusieurs balises META.
J'essaye d'ajouter des balises META supplémentaires avec des valeurs de "idfield" et "value" différentes pour chaque balise DOCUMENT afin obtenir le résultat ci-dessous.

<?xml version="1.0" encoding="utf-8"?>
<batch>
  <selectedNode>Injector</selectedNode>
  <storage>
    <base>XXXXXX</base>
  </storage>
  <documents>
    <document>
      <createdDate>2020-10-09</createdDate>
      <typeFile>PDF</typeFile>
      <href>ATTESTATION2020.pdf</href>
      <metas>
        <meta>
          <idField>C1</idField>
          <value>DUPONT</value>
        </meta>
        <meta>
          <idField>C45</idField>
          <value>OLD</value>
        </meta>
      </metas>
    </document>
    <document>
      <createdDate>2020-10-09</createdDate>
      <typeFile>PDF</typeFile>
      <href>ATTESTATION2019.pdf</href>
      <metas>
        <meta>
          <idField>C1</idField>
          <value>FRITE</value>
        </meta>
        <meta>
          <idField>C2</idField>
          <value>DOUZE</value>
        </meta>
      </metas>
    </document>
  </documents>
</batch>

Pouvez-vous m'aider cela fait plusieurs heures que j'essaye en parcourant des forums sans résultats. Je ne comprends pas le principe.
Merci d'avance
Dernière édition: il y a 4 mois 3 jours par editorxx. Raison: Ajout d'information

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 mois 2 jours - il y a 4 mois 2 jours #30233 par Arnaud Petitjean
Hello Editorxx !

Sois le bienvenu dans le forum ! Tiens d'ailleurs à ce sujet, une petite présentation rapide dans le forum adhoc serait appréciée :).

On ne peut pas dire que la manipulation des fichiers XML quel que soit le langage soit aisée, mais bon c'est pas si compliqué que ça non plus. Il suffit de se plonger un peu dans le langage XML...

Dans l'exemple que je te propose, j'ajoute un node Meta dans le 1er node Document. Il s'agit d'un exemple pour t'en inspirer. Il te suffira de cibler le bon node Document en fonction de tes critères.

Mon code est documenté, tu devrais le comprendre.
# Chargement du document XML en mémoire
[xml]$xml = Get-Content .\fic1.xml

# Clonage d'une propriété Meta pour ne pas avoir à la créer depuis zéro
$cloneMeta = $xml.SelectNodes('/batch/documents/*')[0].metas.meta.Clone()

# Personnalisation de l'élément XML cloné
$cloneMeta.idField = 'C2'
$cloneMeta.value = 'PETITJEAN'

# Insertion de l'élément XML au "bon endroit"
# On cible l'endroit de l'insertion. 
# Ici on cible le 1er noeud enfant trouvé sous /batch/documents/metas
$cible = $xml.SelectNodes('/batch/documents/*')[0].metas.firstchild

# On ajoute le node cloné à l'endroit désiré
$xml.SelectNodes('/batch/documents/*')[0].metas.insertAfter($cloneMeta,$cible)

# On sauvegarde les modifications vers un nouveau fichier
$xml.save('C:\Temp\ficModifié.xml')

Ca me donne le résultat ci-après:
<?xml version="1.0" encoding="utf-8"?>
<batch>
  <selectedNode>Injector</selectedNode>
  <storage>
    <base>XXXXXX</base>
  </storage>
  <documents>
    <document>
      <createdDate>2020-10-09</createdDate>
      <typeFile>PDF</typeFile>
      <href>ATTESTATION2020.pdf</href>
      <metas>
        <meta>
          <idField>C1</idField>
          <value>DUPONT</value>
        </meta>
        <meta>
          <idField>C2</idField>
          <value>PETITJEAN</value>
        </meta>
      </metas>
    </document>
    <document>
      <createdDate>2020-10-09</createdDate>
      <typeFile>PDF</typeFile>
      <href>ATTESTATION2019.pdf</href>
      <metas>
        <meta>
          <idField>C1</idField>
          <value>FRITE</value>
        </meta>
      </metas>
    </document>
  </documents>
</batch>

J'en profite au passage pour ajouter un lien vers le langage XPATH qui te permettra de bien cibler tes éléments dans ton document XML:
Using XPath to Select Nodes

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ou d'un conseil ?
Dernière édition: il y a 4 mois 2 jours par Arnaud Petitjean. Raison: Ajout d'un lien

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.148 secondes
Propulsé par Kunena