Question Suppression d'un node dans un fichier XML

Plus d'informations
il y a 13 ans 10 mois #11718 par Mouloud
Bonjour à tous,

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.

Plus d'informations
il y a 13 ans 10 mois #11720 par Matthew BETTON
Bonjour,

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.

Plus d'informations
il y a 13 ans 10 mois #11721 par Richard Lazaro
Bonsoir,

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.

Plus d'informations
il y a 13 ans 10 mois #11722 par Richard Lazaro
De plus, RemoveChild ne prend qu'un objet.
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.

Plus d'informations
il y a 13 ans 10 mois #11724 par Matthew BETTON
Richard Lazaro écrit:

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.

Plus d'informations
il y a 13 ans 10 mois #11725 par Matthew BETTON
Richard Lazaro écrit:


[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.

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