/*Google AdSense自動広告*/

2020年9月14日月曜日

PowerShellでClassを利用する ver.2.0~文字コード指定、ルートタグ追加し、パース可能なxmlファイルを出力するクラス

前回の記事で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");

↓結果

C:\myCodes\test.xml

<?xml version="1.0" encoding="UTF-8" ?>
<parent>
<testKey1>testVal1-1</testKey1>
<testKey2>testVal2</testKey2>
</parent>

このように、指定したルートタグ<parent>の中に、キーと値がタグとして保存されます。

ルートタグ名は何でもいいのですが、前述のとおりこれが無いとPowerShellやPythonでXMLファイルとして認識してくれないのです。

それでは、次回はPowerShellとPythonでXMLファイルを読み込むクラスを・・・



0 件のコメント:

コメントを投稿