2016年11月27日日曜日

LogicFlow で XML データを繰り返し処理する

LogicApps では XML を扱うのも、繰り返し処理を行うのも微妙にクセがありつかみづらいところでしたので、試したことをメモ書きしておきます。

お題として、11/24 に CLR/H カフェと称した集まりがあり、そこでさかもとさんから頂いたものがあったのでそれを利用しています。

処理対象となる XML データはこれを利用しています。ブラウザで開くと以下のような形で表示されています。

image

ListBucketResult を親要素とした XML データで、Contents エレメントで各モジュールの情報を保有している形式です。HTTP コネクタで取得すると、上記の XML データが扱えるようになりますが、実行履歴では次のように表示されます。

image

これは HTTP コネクタで取得した結果を BASE64 エンコーディングし、ほかのコネクタへと渡しています。Content-Type と Body に分けて値をやりとりしているのですが、他のコネクタで値を利用する際に、BASE64 からのデコードは不要です。MSDN に記載があるのですが、いまいちつかみづらい・・・

次に取得した XML データにおいて、Contents エレメントの数だけ繰り返し処理を行う場合の記載についてです。こちら ForEach コネクタを利用するのはすぐに思いつくことと思います。実際に利用する際は以下のように記載します。

image

LogicApps の関数で用意されている json 関数は、文字列または XML データを JSON として変換します。body(’HTTP') というのは、先程の HTTP コネクタで取得した結果の BODY 部を意味します。これは XML データ全体を表しているので、ルート要素から目的の値を配列として保持している Contents までを ForEach コネクタの対象として記載します。こうすることで、Contents 要素で記載されているすべての要素に対し、繰り返し処理が行われます。

image

繰り返し処理内部での記載は上記のようになります。@item() 関数を利用すると、繰り返し要素を参照できますので、今回は Contents 要素が持つ Key 要素の値を BLOB のファイル名へと利用しています。Replace 関数は文字通り、文字列の置換を行っていて、ここでは /(バックスラッシュ)を _ (アンダースコア)に変換させています。

image

このような記載を行うことで、XML を取得し、その要素数分繰り返しを行う処理が LogicFlow で実施できます。

0 件のコメント:

コメントを投稿