2013-10-08 17 views
29

Sto cercando di creare un elemento XML bambino per questo xml:Come aggiungere un elemento figlio per XML in PowerShell

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

Io uso questo script PowerShell:

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

Ho un errore: Il richiamo del metodo non è riuscito perché [System.String] non contiene un metodo denominato "AppendChild".

+0

Questo è il singolo più stupido "capriccio" in PowerShell. – StingyJack

risposta

46

Se si utilizza la notazione a punti per navigare in un file XML (ad esempio $doc.configuration), Powershell cerca di essere intelligente su ciò che restituisce.

  • Se l'elemento di destinazione è vuoto o contiene solo un singolo nodo di testo, PS restituirà un String.
  • Se l'elemento di destinazione contiene nodi figlio diversi dai nodi di testo, restituirà un XmlElement.
  • Se esistono più elementi di destinazione, verrà restituito un Object[], in cui ogni singolo elemento di matrice è nuovamente soggetto a queste regole, ad es. sarà uno String o uno XmlElement a seconda del suo contenuto.
  • Se l'elemento di destinazione non esiste, PS restituisce $null.

Nel tuo caso è facile dal momento che si desidera aggiungere nodi per l'elemento del documento:

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

ma si potrebbe usare $doc.SelectNodes() o $doc.SelectSingleNode() per navigare intorno al documento XML e hanno sempre un elenco dei nodi/node restituito.

+0

Il codice corretto è $ doc = [xml] (Get-Content $ filePath) Non risolve il problema – Warlock

+2

Ho trovato che se il tag è vuoto, $ doc.configuration è String, se non vuoto - XmlElement. Ho risolto il mio problema usando $ doc.SelectSingleNode ('configuration') che restituisce $ null o XmlElement. – Warlock

+0

Ho corretto la mia risposta. – Tomalak

Problemi correlati