Question
Suppression d'un node dans un fichier XML
- Mouloud
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 4
- Remerciements reçus 0
Avant toute chose je vous félicite pour votre site et la communauté qui se réunit à travers ce forum. J'ai déjà trouvé de nombreuses informations qui m'étaient précieuses.
Depuis peu j'essaie de scripter un maximum en powershell et à vrai dire j'y prend goût.
J'ai cependant un problème pour lequel je ne trouve pas de solution fonctionnelle. Je dois gérer un fichier xml pour supprimer un node qui dispose d'attributs.
Pour que cela soit clair, je vous donne un exemple type de fichier.
[code:1]
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<wpkg>
<host name=\"Pc2096\" profile-id=\"Ccleaner\">
<profile id=\"Java\" />
</host>
<host name=\"Pc2127\" profile-id=\"Ccleaner\">
<profile id=\"Java\" />
<profile id=\"PDFCreator\" />
</host>
<host name=\"Pc2128\" profile-id=\"profile1\" />
<host name=\"Pc2196\" profile-id=\"Ccleaner\">
<profile id=\"Java\" />
</host>
</wpkg>
[/code:1]
Dans ce fichier, je voudrais pouvoir supprimer les éléments Host quels qu'ils soient en envoyant un paramètre au script qui est le numéro de machine.
Autrement dit, le script reçoit par exemple pc2127 en argument, et le script supprime tout l'élément de l'host pc2127, ainsi que ses attributs, etc.
J'ai donné ci-desus trois exemples de la forme sous laquelle peut se présenter l'élément hôte à supprimer.
Je me tourne vers vous car toutes les solutions que j'ai essayées me laissent tourner en rond, j'ai soit un problème, soit l'autre. La présence d'attributs me pose problème, et je ne peux modifier la façon avec laquelle est organisée le fichier.
D'avance merci à vous.
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
Une idée (j'ai placé le contenu que tu as fourni dans F:\test.xml) :
[code:1]$xmlObj = [xml](Get-Content F:\test.xml)
$nodes = $xmlObj.SelectNodes(\"wpkg/host\"«») | Where-Object{$_.Name -eq 'Pc2196'}
$root = $xmlObj.wpkg
[void]$root.RemoveChild($nodes)
# $xmlObj.wpkg
$xmlObj.Save(\"F:\test.xml\"«»)
[/code:1]
@+
Matthew
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
Si on supprime qu'un node à la fois, j'utiliserais cette méthode.
[code:1]
$xml = New-Object System.Xml.XmlDocument -Property @{'Load' = 'C:\Users\richardl\Desktop\test.xml'}
$xml.wpkg.RemoveChild($xml.SelectSingleNode('//host[@name=''Pc2127'']'))
$xml.Save('C:\Users\richardl\Desktop\test.xml')
[/code:1]
il est possible de décomposer la chose pour une meilleure gestion d'erreur.
@Matthew : ce que je reproche à ta technique est d'utiliser le Where-Object alors que le Xpath permet trés bien de filtrer (même de faire des filtre extrement complexe). En fonction de la taille du fichier, ta commande risque d'être lente.
Bien Cordialement,
Richard Lazaro.
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
Donc si ton SelectNodes et ton Where-Object retourne plusieurs objet ... ça va mal tourner ^^
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
De plus, RemoveChild ne prend qu'un objet.
Donc si ton SelectNodes et ton Where-Object retourne plusieurs objet ... ça va mal tourner ^^
Bonjour Richard,
Merci pour ton retour.
Tu as raison.... Dans ce cas il faut préférer la méthode SelectSingleNode, effectivement
@+
Matthew
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
[code:1]
$xml = New-Object System.Xml.XmlDocument -Property @{'Load' = 'C:\Users\richardl\Desktop\test.xml'}
$xml.wpkg.RemoveChild($xml.SelectSingleNode('//host[@name=''Pc2127'']'))
$xml.Save('C:\Users\richardl\Desktop\test.xml')
[/code:1]
J'avais essayé cette notation, mais cela ne fonctionnait pas :
[code:1]$xmlObj.selectnodes(\"wpkg/host\"[name='Pc2096'])[/code:1]
Cela n'aurait pas non plus fonctionné comme ça :
[code:1]$xmlObj.selectnodes(\"wpkg/host[name='Pc2096']\"«»)[/code:1]
D'où le fait ensuite de l'utilisation du Where-Object.
Je comprends mieux maintenant
Encore merci Richard
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Suppression d'un node dans un fichier XML