IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Modification de nœud XML [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 12
    Points
    12
    Par défaut Modification de nœud XML
    Bonjour à tous,

    Bon je me tourne vers vous parce que je suis à d'inspiration pour mon développement .
    Je vous explique, je suis actuellement en train de développer une interface graphique qui interagie avec un fichier de configuration (au format XML) d'un de mes scripts.
    Actuellement je suis entrain de créer les fonctions pour ajouter, modifier, supprimer des valeurs de mon fichier XML.
    Voici une partie de mon fichier XML :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="utf-8"?>
    <Settings> 
      <ARP>
        <ConfigVLAN>
          <Vlan>Vlan1$</Vlan>
          <Vlan>Vlan2$</Vlan>
          <Vlan>Vlan3$</Vlan>
        </ConfigVLAN>
      </ARP>
      <DHCP>
        <ConfigServer>
          <Server>Server1</Server>
          <Server>Server2</Server>
        </ConfigServer>
        <ConfigScope>
          <Scope>Scope1</Scope>
          <Scope>Scope2</Scope>
          <Scope>Scope3</Scope>
        </ConfigScope>
      </DHCP>
    </Settings>

    Je vais prendre comme exemple la fonction qui permet de modifier une valeur.
    Voici ce que j'ai fait :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function modifyXmlItem ($selectedItem, $xmlPath , $newValue) {
    	switch ($xmlPath) {
    		"vlanPath"{$tmpXml = $xml.Settings.ARP.configVLAN}
    		"scopePath"{$tmpXml = $xml.Settings.DHCP.configScope}
    		"serverPath"{$tmpXml = $xml.Settings.ARP.configServer}
    	}
    	#region TEST
    	#	Write-Host $selectedItem
    	#	Write-Host $newValue
    	#endregion
     
    	$tmpXml.SelectSingleNode("Vlan[text()=""$($selectedItem)""]").InnerText = $newValue
    	$xml.Save($path)
    }
    Actuellement elle peut seulement modifier les valeurs des VLANs.
    Ce que je n'arrive pas à faire, c'est comment développer la fonction pour qu'elle puisse servir à modifier tous les noeuds de mon XML...

    Pourriez-vous m'aider, svp
    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Hello un truc simple comme ceci irai ?

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function modifyXmlItem ($selectedItem, $xmlPath , $newValue) {
    	switch ($xmlPath) {
    		"vlanPath" {$xml.Settings.ARP.configVLAN.SelectSingleNode("Vlan[text()=""$($selectedItem)""]").InnerText = $newValue}
    		"scopePath" {$xml.Settings.DHCP.configScope.SelectSingleNode("Scope[text()=""$($selectedItem)""]").InnerText = $newValue}
    		"serverPath" {$xml.Settings.ARP.configServer.SelectSingleNode("Server[text()=""$($selectedItem)""]").InnerText = $newValue}
                    default {return}
    	}
    	$xml.Save($path)
     
        # Tu peux aussi te servir pleinement de l'expression XPath
        # $xml.SelectSingleNode("/Settings/ARP/ConfigVLAN/Vlan[text()=""$selectedItem""]").innertext = $newValue
     
        # et te servir de '
        # $xml.SelectSingleNode('/Settings/ARP/ConfigVLAN/Vlan[text()="' + $selectedItem + '"]').innertext = $newValue
    }

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Ou autrement, peut être plus joli

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function modifyXmlItem ($selectedItem, $xmlPath , $newValue) {
    	switch ($xmlPath)
    	{
    		"vlanPath" {$query = '/Settings/ARP/ConfigVLAN/Vlan[text()="{0}"]' -F $selectedItem}
    		"scopePath" {$query = '/Settings/DHCP/configScope/Scope[text()="{0}"]' -F $selectedItem}
    		"serverPath" {$query = '/Settings/ARP/configServer/Server[text()="{0}"]' -F $selectedItem}
    		default {return}
    	}
     
    	$xml.SelectSingleNode($query).InnerText = $newValue
    	$xml.Save($path)
    }

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Bonjour ericlm128, tout d'abord merci de ton aide.

    J'avais pensé à la première solution que tu as proposé, toutefois, je n'aime pas le fait de réécrire à chaque fois la commande.
    Quant à ta deux proposition, elle est parfaite ! Par contre j'ai une petite question, à quoi correspond l'option -F. Je me doute que ça un lien avec la valeur sélectionnée mais j'arrive pas à faire le lien

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Ok. Super merci de ton aide !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Bonjour ericlm128,

    je me permet de réécrire sur le même poste puisque c'est le même sujet !
    Voilà j'arrive dans la situation ou mon fichier XML est de fait de cette manière :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      <Exclusion>
        <ConfigExclude>
          <Exclude>
            <Constructor>Constructor1</Constructor>
            <Mac>Mac1</Mac>
          </Exclude>
          <Exclude>
            <Constructor>Constructor2</Constructor>
            <Mac>Mac2</Mac>
          </Exclude>
          <Exclude>
            <Constructor>Constructor3</Constructor>
            <Mac>Mac3</Mac>
          </Exclude>
        </ConfigExclude>
      </Exclusion>

    Ces valeur sont celle d'une ListView à deux colonnes.
    Je dois pouvoir ajouter/modifier des valeurs Constructor et Mac. Mais je ne sais pas comment m'y prendre pour imbriquer Constructor et Mac dans une Balise Exclude que je dois aussi créer...

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function fAddXmlItem ($objectType, $itemName, $xmlPath ,$itemValue){
    	switch ($xmlPath) {
    		"vlanPath" {$query = '/Settings/ARP/ConfigVLAN'}
    		"scopePath" {$query = '/Settings/DHCP/configScope'}
    		"serverPath" {$query = '/Settings/DHCP/configServer'}
    		"receiversPath"{$query = '/Settings/Mail/ConfigReceivers'}
    		"ExclusionConstrucPath" {$query = "/Settings/Eclusion/ConfigExclude"}
    		default {return}
    	}
     
    	if ($objectType -match "listbox") {
    		$newItem = $xml.CreateElement($itemName)
    		$tmpXml = $xml.SelectSingleNode($query)
    		$tmpXml.AppendChild($newItem)
    		$newItem.InnerXml= $itemValue
    	}
    	elseif ($objectType -match "listview") {
                ?????
    	}
     
    	$xml.Save($path)
    }

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Bonjour,

    Je n'avais pas vu qu'il y avait des questions subsidiaires

    Voici un exemple pour faire ce que tu souhaite.
    Peut être qu'il y a mieux, je ne sais pas, je ne connais pas trop xml ni powershell.

    Les '[void]' évitent uniquement l'affichage à l'écran.
    La dernière ligne est la pour visualiser le contenu du xml (vérifier)

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    $content= '<?xml version="1.0" encoding="utf-8"?>
      <Exclusion>
        <ConfigExclude>
          <Exclude>
            <Constructor>Constructor1</Constructor>
            <Mac>Mac1</Mac>
          </Exclude>
          <Exclude>
            <Constructor>Constructor2</Constructor>
            <Mac>Mac2</Mac>
          </Exclude>
          <Exclude>
            <Constructor>Constructor3</Constructor>
            <Mac>Mac3</Mac>
          </Exclude>
        </ConfigExclude>
      </Exclusion>'
     
    [xml] $xml = $content
     
    $node = $xml.CreateElement("Exclude")
     
    $Constructor = $xml.CreateElement("Constructor")
    $Constructor.InnerText = "Constructor4"
     
    $Mac = $xml.CreateElement("Mac")
    $Mac.InnerText = "Mac4"
     
    [void] $node.AppendChild($Constructor)
    [void] $node.AppendChild($Mac)
     
     
    [void] $xml.Exclusion.ConfigExclude.AppendChild($node)
     
    $xml.InnerXml

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modification du contenue des fichier XML
    Par robinson50 dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 02/06/2009, 22h29
  2. Réponses: 4
    Dernier message: 15/04/2008, 14h37
  3. VBScript ASP ET XMLDOM Modification attribut dans un fichier XML
    Par PrinceMaster77 dans le forum VBScript
    Réponses: 12
    Dernier message: 11/06/2007, 06h13
  4. [XSLT] modification d'un préfixe namespace XML
    Par abertaud dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 07/05/2007, 16h32
  5. Réponses: 3
    Dernier message: 29/06/2006, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo