IT ニュース&コラム 2017/10/23 通巻749号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■ XML にローカル変数が使えるようになる vbslib の LoadLocalVariableInXML ■■ vbslib の LoadLocalVariableInXML を使うとローカル変数が使える XML に簡単に 対応できるようになります。(ローカル変数が使えるかどうかは、XML をロードする スクリプトによります。) vbslib は、以下からダウンロードできます。 Windows 用です。 http://vbslib.osdn.jp/ http://www.sage-p.com/vbslib/vbslib.htm https://github.com/TsNeko/vbslib 前回、vbslib では、Variable タグを変数定義として扱うことを説明しました。 Variable タグで定義した場合、同じファイルの中のどこからでも変数の値を参照 できます。 XML をロードするスクリプトによっては、他のファイルからでも参照 できることもあります。 このようにどこからでも参照できる変数を、一般に グローバル変数と呼びます。 しかし、どこからでも参照できることが逆に、副作用を伴うケースもあります。 例を挙げます。 ${Base}\FileA.txt ${Base}\Sub\FileB.txt ${Base}\Sub\FileC.txt ${Base}\FileD.txt ${Base}\Sub\FileE.txt ${Base} 変数が 2か所で定義されています。 この XML をロードすると、すでに定義されているという警告が echo 表示されますが、 そのまま続きを実行します。 変数を参照すると、参照する場所に関わらず、下で定義 した値になります。 つまり、File タグの間のテキストは、 C:\Base2\FileA.txt C:\Base2\Sub\FileB.txt C:\Base2\Sub\FileC.txt C:\Base2\FileD.txt C:\Base2\Sub\FileE.txt になります。 C:\Base1\FileA.txt C:\Base1\Sub\FileB.txt C:\Base1\Sub\FileC.txt C:\Base2\FileD.txt C:\Base2\Sub\FileE.txt ではありません。 XML はデータを表現しており、スクリプト言語のような手順を表現していません。 よって、変数と呼びますが、スクリプト言語での「定数」に相当します。 このように変数名(シンボル)が衝突してしまったときでも、変数を参照できる範囲を 一部に限定すれば、衝突しません。 Variable タグの代わりに LocalVariable タグを XML に記述すれば、参照できる範囲を一部に限定できます。 その範囲(スコープ)は、 LocalVariable タグの兄弟か子、別の言い方をすれば、LocalVariable タグの親の子です。 このような変数を、一般にローカル変数と呼びます。 ${Base}\FileA.txt ${Base}\Sub\FileB.txt ${Base}\Sub\FileC.txt ${Base}\FileD.txt ${Base}\Sub\FileE.txt File タグの間のテキストは、 C:\Base1\FileA.txt C:\Base1\Sub\FileB.txt C:\Base1\Sub\FileC.txt C:\Base2\FileD.txt C:\Base2\Sub\FileE.txt になります。 vbslib の XML のローカル変数は、XML の仕様を変えるわけではないので、 XML をパースして取得できる値は、変数が展開された値ではありません。 それぞれのローカル変数のスコープに合わせて、変数展開をする関数を呼ぶ 必要があります。 まず、変数を使わずに XML をパースするスクリプトを示します。 path_of_XML = "Example.xml" Set root = LoadXML( path_of_XML, Empty ) '// LoadXML は vbslib の関数 For Each a_file_tag In root.selectNodes( "Group/File" ) value_with_variable = a_file_tag.selectSingleNode( "text()" ).nodeValue Next 次に、グローバル変数を展開するスクリプトを示します。 path_of_XML = "Example.xml" Set root = LoadXML( path_of_XML, Empty ) Set global_variables = LoadVariableInXML( root, path_of_XML ) '// ★追加 For Each a_file_tag In root.selectNodes( "Group/File" ) value_with_variable = a_file_tag.selectSingleNode( "text()" ).nodeValue value = global_variables( value_with_variable ) '// ★追加 Next 最後に、グローバル変数だけでなくローカル変数も展開するスクリプトを示します。 path_of_XML = "Example.xml" Set root = LoadXML( path_of_XML, Empty ) Set global_variables = LoadVariableInXML( root, path_of_XML ) For Each a_file_tag In root.selectNodes( "Group/File" ) Set variables = LoadLocalVariableInXML( _ a_file_tag, global_variables, path_of_XML ) '// ★追加 value_with_variable = a_file_tag.selectSingleNode( "text()" ).nodeValue value = variables( value_with_variable ) '// ★変更 Next 5行目の LoadLocalVariableInXML が、ローカル変数をロードする関数です。 global_variables にロードされているグローバル変数と、ロードしたローカル変数の 両方が返り、variables に格納されます。 LoadLocalVariableInXML 関数の 第1引数には、変数を展開する値を持っている XML要素、または、その兄弟の XML要素を指定します。 ■■ 注目ニュース 一覧 ■■ ◇ 一部 Google Home Mini で勝手に録音してサーバに送信するバグ。修正済み。 https://japan.cnet.com/article/35108585/ … 何かのタイミングで、録音してサーバに送信する機能自体はあるようだ。 ◇ Wi-FiのWPA2脆弱性 KRACK、今ユーザーにできる対処法。 https://japan.cnet.com/article/35108866/ … 攻撃者はワイヤレスネットワークの電波が届く範囲内にいる必要がある。 ◇ 10月17日に配信開始。Windows 10 Fall Creators Update でPCはこう変わる。 http://www.itmedia.co.jp/pcuser/articles/1710/17/news045.html … 1つの目玉は、絵に自動的にタグが付いて検索できること。 ◇ Bash on Windows という名称は非推奨に。正式名称 Windows Subsystem for Linux 。 http://www.publickey1.jp/blog/17/bash_on_windowswindows_subsystem_for_linuxwsl.html … Ubuntu 以外も乗せられる。 Javaも動く。 ◇ ついにWindowsへ導入が始まった Fluent Design System 5つの基本要素。 http://ascii.jp/elem/000/001/570/1570738/ … 3D空間にウィンドウが浮いたようになるのはいつだろう。 ◇ NVIDIA、レベル5の自動運転を見据えた DRIVE PX Pegasus を発表。 https://japan.cnet.com/article/35108589/ … 周囲の環境を常に監視する端子を多く備えている。 ■■ ソフトウェアデザイン館 Sage Plaisir 21 ■■ ホームページ >>> http://www.sage-p.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> http://www.sage-p.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm