前回の記事でXMLファイルを作成するPowerShellのClassを紹介しましたが、あれには重大な欠点がありました。
XML宣言は書きましたが、タグを羅列するだけで、ルートタグは特に作成しませんでした。これでも大丈夫かと思っていましたが、PowerShellやPythonのXML Parserでは、ルートタグが無いとエラーを吐いて、読み込んですらしてくれないのです(ただ、キーと値のデータを保存したかっただけなのに…)。
もう一点、文字コードも明確にUTF-8で指定しないと、PowerShellの標準はUTF-16なので、XML宣言と相違が出ることになります。
ルートタグで囲うので、データを保持するハッシュテーブルと、最後にセーブする関数を追加してクラスを再作成します。
仕様
- PowerShellでタグと値を指定して、XMLファイルを作成する
- ルートタグを指定して、保存時に全てのタグを囲う ←追加
- 文字コードをUTF-8にする ←追加
クラス
class xmlFile { $values = @{}; $override = $false; [void]SetOverride($set_boolean){ $this.override = $set_boolean; } [void]AddVal($key, $val){ if(!$this.values.Contains($key)){ $this.values.Add($key, $val); }elseif($this.override){ $this.values.$key = $val; } } [String]GetVal($key){ return $this.values.$key; } [void]SaveXml($root_tag, $save_filename){ '<?xml version="1.0" encoding="UTF-8" ?>' | Out-File $save_filename -Encoding utf8; "<$root_tag>" | Out-File $save_filename -Append -Encoding utf8; $this.values.keys | Sort-Object | ForEach-Object{ $set_value = $this.values.$_; "<$_>$set_value</$_>" | Out-File $save_filename -Append -Encoding utf8; } "</$root_tag>" | Out-File $save_filename -Append -Encoding utf8; } }
関数AddValでハッシュテーブルvaluesにキーと値を追加します。変数overrideの値によって、同名キーがある場合に無視するか、値を更新します。
キーと値はハッシュテーブルに格納し、関数SaveXmlによってXML宣言とルートタグを追加して保存します。いちいち保存しなくていいようにしたかったのですが、ルートタグの追加には必須です。
文字列をそのままパイプでOut-Fileに流してやれば、ファイルに保存できます。オプション -Appendでファイルに追記、-Encodeでエンコードを設定できます。
ハッシュテーブルのkeysを、Sort-Objectを介してForEach-Objectに渡すと、キー名アルファベット昇順で処理できます。
使用例
$xf = New-Object xmlFile; $xf.AddVal("testKey1", "testVal1"); $xf.AddVal("testKey2", "testVal2"); Write-Output $xf.GetVal("testKey1"); $xf.SetOverride($True); $xf.AddVal("testKey1", "testVal1-1"); $xf.SaveXml("parent", "C:\myCodes\test.xml");
↓結果
0 件のコメント:
コメントを投稿