新しい要素の挿入
ここでは新しい要素を挿入する方法について説明します。
前準備として下記を実行し、XPathNavigatorの現在位置をpopulation_data/prefecture/nameにしておきます。
$xmlDoc = [xml](Get-Content population.xml -Encoding UTF8) $Navi = [Xml.Xpath.XPathNavigator] $XmlDoc.CreateNavigator() #population_dataへ移動 $Navi.MoveToFirstChild() #prefectureへ移動 $Navi.MoveToFirstChild() #name(値:青森県)へ移動 $Navi.MoveToFirstChild()

現在の要素の前に新しい要素を挿入する
InsertBeforeメソッドを実行すると、現在の要素の前に新しい要素を挿入します。
$Navi.InsertBefore("<before>前にデータを挿入</before>")

上記を実行すると、<name>要素の前に新しい要素が挿入され、XMLは下記のようになります。
<population_data>
<prefecture district="東北">
<before>前にデータを挿入</before>
<name>青森県</name>
<population>1392029</population>
</prefecture>
<!-- 以下省略 -->
現在の要素の後ろに新しい要素を挿入する
InsertAfterメソッドを実行すると現在の要素の後に新しい要素を挿入します。
$Navi.InsertAfter("<after>後ろにデータを挿入</after>")

上記を実行すると、<name>要素の後ろに新しい要素が挿入され、XMLは下記のようになります。
<population_data>
<prefecture district="東北">
<before>前にデータを挿入</before>
<name>青森県</name>
<after>後ろにデータを挿入</after>
<population>1392029</population>
</prefecture>
<!-- 以下省略 -->
要素を削除する
ここでは要素を削除する方法について説明します。
要素を削除するには DeleteSelfメソッドを実行します。
DeleteSelfメソッドは、現在の要素とその子ノードを削除します。
XPathNavigatorが 一番最初のprefecture要素を指し示しているときにこのメソッドを実行すると、青森県に関するprefectureデータが削除されます。
$Navi.DeleteSelf()

<population_data>
<prefecture district="東北">
<name>岩手県</name>
<population>1349455</population>
<!-- 以下省略 -->
変更結果をファイルに保存する
変更した結果をファイルに保存する方法について説明します。
これまでに変更した結果は変数$Naviに格納されています。XPathNavigatorの、メンバメソッドWriteSubtreeを使用して変更したXMLを保存することができます。
ただし、WriteSubtreeメソッドはXPathNavigatorが現在指し示している要素から下のデータしか保存を行わないため、全体を保存するにはMoveToRootメソッドを実行する必要があります。
保存手順
- XMLセッティングの作成
保存するXMLファイルのエンコーディングやインデントを指定します。
- XmlWriterの作成
XmlWriterを利用して保存を行います。 - 現在位置をルートノードへ移動
MoveToRootメソッドを使用してルートノードへ移動します。 - 変更結果を保存
WriteSubTreeメソッドを使用して保存します。 - XmlWriterのクローズ
使い終わった
XmlWriterを閉じます。
下記にコード例を示します。
# 1) XMLセッティングの作成
$settings = New-Object System.Xml.XmlWriterSettings
#インデントの指定
$settings.Indent = $True
#エンコーディングの指定
$settings.Encoding = [System.Text.Encoding]::UTF8
# 2) XmlWriterの作成
$xmlWriter = [System.Xml.XmlWriter]::Create("C:\Work\population2.xml", $settings)
# 3) 保存を行う前にルートノードへ移動
$Navi.MoveToRoot()
# 4) 保存
$Navi.WriteSubtree($xmlWriter)
# 5) XmlWriterのクローズ
$xmlWriter.Close()

まとめ
今回は、XPathNavigatorを利用した
- データの変更
- XPathNavigatorの現在位置を操作する方法
- 要素の挿入
- 要素の削除
- 変更したデータの保存
について説明しました。
ここまでの内容を理解できれば、PowerShellで自由にXMLを操作できることと思われます。ぜひ習得して日常業務に生かしていただければ幸いです。
