LoginSignup
11
1

More than 3 years have passed since last update.

PowerShellでXMLのノードを挿入(結合)する

Last updated at Posted at 2020-01-30

XmlNodeクラス完全に理解した(わからん)

PowerShellはxmlファイルの読み込みはすごく楽。

xml.ps1
$xml = [xml](Get-Content ./filename.xml)
#あとはオブジェクトみたいに$xml.Document....って感じでアクセスできる。

ただ、ノードを挿入というか結合するケースがよく分からなかった。
やりたいことは単純で、下記みたいにAlphaとBravoのNoteを結合(AplphaにBraboのNoteを挿入)したい。

Alpha.xml
<Document>
  <Name></Name>
  <Note></Note>
  <Note></Note>
</Document>
Bravo.xml
<Document>
  <Name></Name>
  <Note></Note>
  <Note></Note>
  <Note></Note>
</Document>

でネットで色々と調べてみたら、冗長な書き方ばかりで
「こんなコード使いまわせないよ…」って気持ちになった😢

そんなわけで、重たい腰を上げてMSDNを読み込むことにした。
XmlNode クラス

そしたら、どうやらImportNodeメソッドってやつがあるらしい。
https://docs.microsoft.com/ja-jp/dotnet/standard/data/xml/copying-existing-nodes-from-one-document-to-another

というわけで、こんな感じのさっぱりしたコードが出来上がりました。めでたしめでたし。

sample.ps1

$alpha = [xml](Get-Content ./alpha.xml)
$bravo = [xml](Get-Content ./bravo.xml)

# $bravo.GetElementsByTagName()のリターンはSystem.Xml.XmlNodeList
$bravo.SelectNodes("//Note") | % {
    [void]$alpha.Document.AppendChild($alpha.ImportNode($_, $true))
}
#コードに誤りがあったので修正しました。@taruntaさんに感謝。

余談

型の互換に手間取って少し時間がかかった。
個人的には下記のコードで結合してくれたら直感的だし嬉しいなって思う。

$alpha = [xml](Get-Content ./alpha.xml)
$bravo = [xml](Get-Content ./bravo.xml)

$alpha.Document.Note += $bravo.Document.Note
# =>エラー。

# ちなみに
# $alpha.Document.Note + $bravo.Document.Note
# はできる。というのもこの時点では両方ともSystem.Arrayに変換されているから。
11
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
1