J'essaie de renommer un nœud XML à l'aide de PowerShell. Par exemple: Je veux renommer le premier Je ne sais pas comment remplacer la balise pc1Name > code> respectivement). Voici ce que j'ai, jusqu'à présent: p>
4 Réponses :
En bout de ligne, un nom de noeud XML est immuable. Référence MSDN .
Voici un exemple rapide de créer un nouveau nœud avec les données requises. J'espère que ça aide. p> sortie: p>
Cela fonctionne principalement, je dois utiliser un fichier comme entrée et sortie. Donc, j'ai remplacé le INPUTTEXT code> avec $ entréeFile code> et appliqué les modifications qui apparaissent à l'aide de $ xml.outerxml code> Cependant, comment puis-je Enregistrez le fichier XML? J'ai essayé $ xml.save ($ introuvoir) code> mais cela ne fonctionne pas.
L'erreur devrait vous dire ce qui ne va pas sur la sauvegarde. Le fichier est-il verrouillé? Ou l'objet $ XML n'a-t-il pas une méthode de sauvegarde? (Si tel est le cas, vous devrez obtenir une poignée sur un système.xml.xmldocument.) Le point clé est d'observer le message d'erreur avec soin et d'examiner la documentation d'objet appropriée.
Renommer les nœuds en XML est plus compliqué que vous ne pourriez vous attendre. C'est particulièrement mauvais si le nœud est un nœud racine ou un parent avec une hiérarchie complexe de nœuds d'enfants. La plupart des méthodes "Renommer" que j'ai vues cloneront les enfants et les appends au nouveau nœud. Ce processus est un peu plus facile si votre API comprend également une méthode de remplacement. (Je peux fournir des détails si vous en avez besoin.)
Une méthode alternative que j'ai utilisée (surtout si le XML peut être représenté sous forme de chaîne) consiste à remplacer le texte dans le XML avant de la convertir en xmldocument. P>
$InputText = @" <configuration> <desktops> <name>PC001</name> <domain>CORP</domain> </desktops> <laptops> <name>PC002</name> <domain>CORP</domain> </laptops> </configuration> "@ $regex = [regex]'(</?)name>' $ModifiedText = $regex.Replace($InputText,"`$1PC1Name>",2) $xml = [xml]$ModifiedText
$oldtag = "name" $newtag = "PC1name" $xml = Get-Content D:\oldfile.xml $new = $xml -replace $oldtag, $newtag Set-content -path D:\newfile.xml -value $new My way is I convert the XML to a string, then replace the node (which in this case is just normal string). It works for me.
Très mauvaise solution ... si votre chaîne arrive à apparaître ailleurs, vous faites un bi gmistake
inspiré par un Simple C # Solution J'ai fini par cette fonction (qui prend également en charge les attributs): Si le résultat n'est pas nécessaire, il peut être ignoré - le nœud renommé fait déjà partie du document, le $ oldnode code> appartenait à. p> Exemple: P> $InputFile = "NetworkConfigs.xml"
[xml] $doc = Get-Content $InputFile
$nameNode = $doc.SelectSingleNode('/configuration/desktops/name')
RenameXmlNode $nameNode $nameNode.InnerText
$xml.Save($InputFile)