/*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にする ←追加


クラス


  1. class xmlFile
  2. {
  3. $values = @{};
  4. $override = $false;
  5.  
  6. [void]SetOverride($set_boolean){
  7. $this.override = $set_boolean;
  8. }
  9. [void]AddVal($key, $val){
  10. if(!$this.values.Contains($key)){
  11. $this.values.Add($key, $val);
  12. }elseif($this.override){
  13. $this.values.$key = $val;
  14. }
  15. }
  16.  
  17. [String]GetVal($key){
  18. return $this.values.$key;
  19. }
  20.  
  21. [void]SaveXml($root_tag, $save_filename){
  22. '<?xml version="1.0" encoding="UTF-8" ?>' | Out-File $save_filename -Encoding utf8;
  23. "<$root_tag>" | Out-File $save_filename -Append -Encoding utf8;
  24.  
  25. $this.values.keys | Sort-Object | ForEach-Object{
  26. $set_value = $this.values.$_;
  27. "<$_>$set_value</$_>" | Out-File $save_filename -Append -Encoding utf8;
  28. }
  29.  
  30. "</$root_tag>" | Out-File $save_filename -Append -Encoding utf8;
  31. }
  32. }


関数AddValでハッシュテーブルvaluesにキーと値を追加します。変数overrideの値によって、同名キーがある場合に無視するか、値を更新します。

キーと値はハッシュテーブルに格納し、関数SaveXmlによってXML宣言とルートタグを追加して保存します。いちいち保存しなくていいようにしたかったのですが、ルートタグの追加には必須です。

文字列をそのままパイプでOut-Fileに流してやれば、ファイルに保存できます。オプション -Appendでファイルに追記、-Encodeでエンコードを設定できます。

ハッシュテーブルのkeysを、Sort-Objectを介してForEach-Objectに渡すと、キー名アルファベット昇順で処理できます。


使用例


  1. $xf = New-Object xmlFile;
  2. $xf.AddVal("testKey1", "testVal1");
  3. $xf.AddVal("testKey2", "testVal2");
  4. Write-Output $xf.GetVal("testKey1");
  5. $xf.SetOverride($True);
  6. $xf.AddVal("testKey1", "testVal1-1");
  7. $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 件のコメント:

コメントを投稿