Question Suppression d'un node dans un fichier XML

Plus d'informations
il y a 13 ans 10 mois #11728 par Richard Lazaro
Alors, en fait il suffit de mettre le @ devant le name (sensible à la casse) pour attaquer l'attribut.

Il y a deux choses à différencier, les attributs dans les noeuds et les noeuds avec une valeur texte.

noeud avec attribut name
[code:1]
<host name=\"Pc2096\" profile-id=\"Ccleaner\"/>
[/code:1]

noeud avec valeur texte
[code:1]
<host profile-id=\"Ccleaner\">
<name>Pc2096</name>
</host>
[/code:1]

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 #11730 par Mouloud
Merci beaucoup à tous pour vos réactions, cela me permet dejà de voir plus clair.

J'ai cependant encore un soucis. J'aimerais recevoir dans le script l'attribut name à supprimer via un argument.

J'ai procédé comme ceci mais j'ai systématiquement une erreur. J'ai essayé de jouer sur les quotes en me disant que cela viendrai peut-être de ça mais je ne trouve pas la solution. :s

[code:1]
$pc = PC2334
#$pc = $args

$xml = New-Object System.Xml.XmlDocument -Property @{'Load' = 'C:\hosts.xml'}
$xml.wpkg.RemoveChild($xml.SelectSingleNode('//host[@name=''$pc'']'))

$xml.Save('C:\hosts.xml')
[/code:1]

Comme vous voyez j'ai essayé en entrant la string moi-même ou en la recevant directement comme paramètre lors de l'appel du script, mais je tourne en rond. Ca m'a l'air d'une bêtise en plus mais je n'arrive pas à mettre la main dessus...

Encore merci à vous.

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

Plus d'informations
il y a 13 ans 10 mois #11731 par Richard Lazaro
Alors, pour faire cela, il faut connaître la gestion des chaînes de caractères.

Les double quotes qui est une chaîne de caractère interprété cad que les variables seront évaluées (entre autre)

Les simple quotes est une chaîne de caractère basique.

Pour plus d'info voir Help about_Quoting_Rules

De cette aide, que je te conseille fortement de lire, voici ce que nous pouvons en tirer :

[code:1]
$pc = PC2334
#$pc = $args

$xml = New-Object System.Xml.XmlDocument -Property @{'Load' = 'C:\hosts.xml'}

$xml.wpkg.RemoveChild($xml.SelectSingleNode(\"//host[@name='$pc']\"«»))

$xml.Save('C:\hosts.xml')
[/code:1]

Tu remarqueras la disparition du doublement de la simple quote autour de la valeur car la chaîne est maintenant délimité avec des doubles quotes.

En espérant avoir été clair.

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 #11733 par Mouloud
Oui en effet. C'est en fait de là que venait mon erreur depuis le début. J'ai réessayé un ancien script et en modifiant la syntaxe des quotes ça passe. Je vais appronfondir la chose pour ne plus avoir de problèmes à l'avenir. Ca fait un certains temps que je cherchais... :D

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

Plus d'informations
il y a 13 ans 10 mois #11735 par Mouloud
Pfff je suis vraiment nul.

J'essaie maintenant de ne pas supprimer tout le noeud host mais juste les noeuds enfants profile id.

Je ne parviens pas à isoler les noeuds enfants en me basant sur l'attribut name de l'hôte...

Donc pour passer de ceci :

<?xml version=\"1.0\" encoding=\"UTF-8\"?>

[code:1]<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]

à celà :

[code:1]<wpkg>
<host name=\"Pc2096\" profile-id=\"Ccleaner\">
<profile id=\"Java\" />
</host>
<host name=\"Pc2127\" profile-id=\"Ccleaner\"/>
<host name=\"Pc2128\" profile-id=\"profile1\" />

<host name=\"Pc2196\" profile-id=\"Ccleaner\">
<profile id=\"Java\" />
</host>
</wpkg>[/code:1]

si on imagine que l'argument passé au script était PC2127.

Je viens vous faire signe si je trouve entre temps. ;-)

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

Plus d'informations
il y a 13 ans 10 mois #11736 par Richard Lazaro
Dans ce cas là, il faut parcourir la liste des noeuds enfant (vu qu'on peut en avoir bien plus que un)


J'ai éclaté un peu plus mon code
[code:1]
$pc = 'Pc2127'
$file = 'C:\Users\richardl\Desktop\test.xml'

$xml = New-Object System.Xml.XmlDocument -Property @{'Load' = $file}
$nodes = $xml.SelectNodes(\"//host[@name='$pc']/profile\"«»)

$nodes | ForEach-Object {
$xml.SelectSingleNode(\"//host[@name='$pc']\"«»).RemoveChild($_)
}

$xml.Save($file)
[/code:1]

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.

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