2013-10-08 4 views
29

Я пытаюсь создать дочерний XML-элемент для этого XML:Как добавить дочерний элемент для XML в PowerShell

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

Я использую этот PowerShell скрипт:

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

У меня есть ошибка: Ошибка вызова метода, потому что [System.String] не содержит метода с именем 'AppendChild'.

+0

Это должно быть единственным самым тупым «quirk» в powershell. – StingyJack

ответ

46

Если вы используете точечную нотацию для перемещения по файлу XML (например, $doc.configuration), Powershell пытается быть умным в отношении того, что он возвращает.

  • Если целевой элемент пуст или содержит только один текстовый узел, PS вернет String.
  • Если целевой элемент содержит дочерние узлы, отличные от текстовых узлов, он возвращает XmlElement.
  • Если существует несколько целевых элементов, оно возвращает Object[], где каждый отдельный элемент массива снова подчиняется этим правилам, например. он будет либо String, либо XmlElement в зависимости от его содержимого.
  • Если целевой элемент не существует, PS возвращает $null.

В вашем случае это легко, так как вы хотите добавить узлы в элемент документа:

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

но вы можете использовать $doc.SelectNodes() или $doc.SelectSingleNode() для навигации по документу XML и всегда есть список из узла/узлов вернулся.

+0

Правильный код $ doc = [xml] (Get-Content $ filePath) Он не разрешает мою проблему – Warlock

+2

Я обнаружил, что если тег пуст, $ doc.configuration является String, если не пуст - XmlElement. Я решил проблему с помощью $ doc.SelectSingleNode ('configuration'), которая возвращает $ null или XmlElement. – Warlock

+0

Я исправил свой ответ. – Tomalak

Смежные вопросы