web-dev-qa-db-ja.com

PowerShellでXMLの子要素を追加する方法

このxmlの子XML要素を作成しようとしています。

<?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'という名前のメソッドが含まれていないため、メソッドの呼び出しに失敗しました。

44
Warlock

ドット表記を使用して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ドキュメント内を移動し、常にノード/ノードリストを返すことができます。


この振る舞いの感性について議論することもできますが、実際には、(構成ファイルからの値の読み取りやAPI応答からの値の読み取りなどの)タスクを使用する(健全に構造化された)XMLを非常に簡単にします。それがこの単純な構文の目的です。

creating XMLには適したツールではありませんが、これはより複雑なタスクです。ここでは、最初からDOM APIメソッドを使用する方が適切です。

63
Tomalak