web-dev-qa-db-fra.com

Comment ajouter un élément enfant pour XML dans PowerShell

J'essaie de créer un élément XML enfant pour ce XML:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>

J'utilise ce script PowerShell:

[xml] $doc = Get-Content($filePath)
$child = $doc.CreateElement("newElement")
$doc.configuration.AppendChild($child)

J'ai une erreur: L'appel de la méthode a échoué car [System.String] ne contient pas de méthode nommée 'AppendChild'.

44
Warlock

Si vous utilisez la notation pointée pour parcourir un fichier XML (par exemple, $doc.configuration), Powershell tente d’être intelligent en ce qu’il renvoie.

  • Si l'élément cible est vide ou ne contient qu'un seul nœud de texte, PS renverra un String.
  • Si l'élément cible contient des nœuds enfants autres que des nœuds de texte, il retournera un XmlElement.
  • Si plusieurs éléments cibles existent, il retournera un Object[], Où chaque élément de tableau individuel est à nouveau soumis à ces règles, par exemple. ce sera soit un String ou un XmlElement en fonction de son contenu.
  • Si l'élément cible n'existe pas, PS renvoie $null.

Dans votre cas, c'est simple puisque vous souhaitez ajouter des nœuds à l'élément de document:

$doc = New-Object System.Xml.XmlDocument
$doc.Load($filePath)
$child = $doc.CreateElement("newElement")
$doc.DocumentElement.AppendChild($child)

mais vous pouvez utiliser $doc.SelectNodes() ou $doc.SelectSingleNode() pour naviguer dans le document XML et toujours avoir un nœud/une liste de nœuds.


On pourrait discuter de la sensibilité de ce comportement, mais en réalité, cela simplifie l'utilisation de XML (structuré de manière rationnelle) - par exemple, la lecture de valeurs à partir d'un fichier de configuration ou d'une réponse d'API. C'est le but de cette syntaxe simple.

Ce n'est pas un bon outil pour créer XML, ce qui est une tâche plus complexe. Utiliser les méthodes de l'API DOM depuis le début est la meilleure approche ici.

63
Tomalak