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に変換されているから。