7
votes

Comment puis-je renommer un nœud XML à l'aide de PowerShell?

J'essaie de renommer un nœud XML à l'aide de PowerShell. Par exemple: xxx

Je veux renommer le premier (nom> étiquettes sur (et respectivement). Voici ce que j'ai, jusqu'à présent: xxx

Je ne sais pas comment remplacer la balise avec autre chose. Conseils?


0 commentaires

4 Réponses :


8
votes

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

sortie: xxx


2 commentaires

Cela fonctionne principalement, je dois utiliser un fichier comme entrée et sortie. Donc, j'ai remplacé le INPUTTEXT avec $ entréeFile et appliqué les modifications qui apparaissent à l'aide de $ xml.outerxml Cependant, comment puis-je Enregistrez le fichier XML? J'ai essayé $ xml.save ($ introuvoir) 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.



4
votes

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


0 commentaires

2
votes
$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. 

1 commentaires

Très mauvaise solution ... si votre chaîne arrive à apparaître ailleurs, vous faites un bi gmistake



0
votes

inspiré par un Simple C # Solution J'ai fini par cette fonction (qui prend également en charge les attributs): xxx pré>

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)


0 commentaires