PowerShell流のXML生成術

多くの言語ではXMLの生成に通常DOM(Document Object Model)を使いますが、PowerShellではDOMを使うよりも可読性や使い勝手の良さでより優れた方法があります。

基本

その方法は以下のように「ヒア文字列」と「文字列への変数展開」を利用した簡易的なテンプレートを使用したものです。

$value = 100
@"
<?xml version="1.0" encoding="utf-8"?>
<root>
 <value>$value</value>
</root>
"@

このスクリプトの出力は、

出力
<?xml version="1.0" encoding="utf-8"?>
<root>
 <value>100</value>
</root>

となります。

@""@で囲った文字列はヒア文字列と呼ばれ、改行やダブルクォーテーションなどを直接含めることができます。また文字列*1の中で「$」から始まる単語はそのスコープ内の変数の値に置き換えられます。

繰り返し

変数が配列の場合などにその要素の数だけ繰り返したい場合などは以下のように記述します。

$values = @(10, 20, 30)
@"
<?xml version="1.0" encoding="utf-8"?>
<root>
"@
$values | % { $value = $_; @"
 <value>$value</value>
"@ }
@"
</root>
"@

このスクリプトの出力は、

出力
<?xml version="1.0" encoding="utf-8"?>
<root>
 <value>100</value>
 <value>200</value>
 <value>300</value>
</root>

となります。

やっている事は繰り返したいところを$valueの数だけforeach(% { })を使ってループしているだけです。

また、以下のようにすると変数に代入することができます。

$values = @(10, 20, 30)
$xml = [string](& { @"
<?xml version="1.0" encoding="utf-8"?>
<root>
"@
$values | % { $value = $_; @"
 <value>$value</value>
"@ }
@"
</root>
"@ })

これはテンプレート部分をスクリプトブロック({})で囲み、&で呼び出してからその結果(ここでは配列)を文字列に変換しています。

PowerShellでは配列をstring型にキャストするとスペースで連結した文字列に変換されます。

このようにヒア文字列と変数展開を利用すればDOMを使うよりも可読性の高いコードを記述することができます。

*1:ヒア文字列か""で囲ったもの