PADでXML/JSON形式で取得したデータを利用する

Power Automate for DesktopでXML形式、もしくはJSON形式で取得したデータをループ処理で使用する場合に必要なアクションについて記載します。
# こんな時に使える
WebAPIでデータを取得するとXML形式もしくはJSON形式でレコードが返ってきます。従ってPADでWebAPIと連携したフローを作成したい際などに本記事は参考になるかと思います。

:::note info
ただし、本記事ではPADでのWeb APIからデータを取得するためのTip'sは記載いたしません。そちらの情報をまず得たい方はが分かりやすかったので参考にしてみてください。
:::

https://www.teijitaisya.com/pad-restapi/


# 1⃣XMLデータ形式の読み取り
## 概要
1. レコードを複数回取得するには「XPath式を実行します」アクションでリスト化する
1. リストのレコード数分ループするFor Eachアクション内でCurrentItemに対して「XML要素の値を取得します」を実行

## サンプル
- 以下のようなXML形式データがあったとすると

```
<?xml version="1.0" encoding="UTF-8"?>
<BankList>
    <Bank>
        <code>000000000901</code>
        <name>XXX銀行XXX営業部親口座</name>
    </Bank>
    <Bank>
        <code>00000000999</code>
        <name>XXX銀行XXX支店</name>
    </Bank>
</BankList>
```

- アクション「ファイルからXMLを読み取ります」の戻り値(変数XmlDocumentに保存される値)は上記のXML形式のデータ全てなので、値を取り出す必要があります。

① アクション「Xpath式を実行します」で**レコードを**リスト化。今回のXMLデータでは`<Bank>`~`</Bank>`で囲まれた値が1レコードとなります。
【結果】![xml1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/75c398e7-1e52-3ff0-b31b-c6344371dcf3.png)

::: note warn 
ここで「Xpath式を実行します」の代わりに「XML要素の値を取得します」を実行すると戻り値はリストで返すことができないため1行目のレコードしか取得できません！
![xml2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/258c15ad-6bcd-d75d-1f5e-d307ae965ab4.png)
:::

②For eachアクションで反復処理を①の手順で生成されたリストに設定。
③ For eachアクション内では**1つのレコードから更に使用する項目の値を取り出すため**アクション「XML要素の値を取得します」を実行。

::: note warn
ここで「XML要素の値を取得します」の代わりに`<Bank>`~`</Bank>`に対して再度「Xpath式を実行します」を実行すると値だけではなく`<code>`・`</code>`も取れてきてしまいます。
![xml3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/dd4c3d73-27e1-48a9-8f97-6b692392cf86.png)
:::

### 最終的なフロー
 ![xml4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/4d287afc-e263-bce5-f894-35e02b6e9c22.png)

## 参考
https://www.youtube.com/watch?v=YHUi35MO84c

---
# 2⃣JSON形式のデータ読み取り
## 概要
1. アクション「JSONをカスタムオブジェクトに変換」
1. **レコードをリスト形式で保存するため、** 1の結果をアクション「変数の設定」に入れ込む
1. For Eachアクションで2.で設定した変数分ループするように設定
1. ループ内で、アクション「変数の設定」を使用し**１つのレコードに対して項目と値のリストを生成**
1. 4で生成したリストから目的の項目を取り出す

::: note info
上記手順はJSONの構造にもよるためJSONの取得結果を確認して少しずつフローを組むとよいです。
:::

## サンプル
- 下記のようなJSON形式のデータがあったとします。
```
{
    "projects": [
        {
            "id": 101,
            "name": "name01",
            "identifier": "001",
            "description": "",
            "status": 1,
            "is_public": false,
            "inherit_members": false,
            "created_on": "2022-03-29T06:52:04Z",
            "updated_on": "2022-03-29T01:59:59Z"
        },
        {
            "id": 102,
            "name": "name02",
            "identifier": "rm0004289",
            "description": null,
            "parent": {
                "id": 2,
                "name": "parentname02"
            },
            "status": 1,
            "is_public": false,
            "inherit_members": true,
            "created_on": "2021-02-29T05:55:41Z",
            "updated_on": "2021-02-29T05:55:41Z"
        },
        ...
    ],
    "total_count": 45,
    "offset": 0,
    "limit": 25
}
```

1. アクション「JSONをカスタムオブジェクトに変換」では下記のように結果がリスト型で保存されます。
![JSON2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/95f3a6c6-f1b0-27fe-b02a-445ddf30df02.png)

1. 使用したいレコードのリストはJsonAsCustomObjectのprojectsプロパティの中にあるのでアクション「変数の設定」でリストを生成。
![JSON3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/2fcc1e71-cfda-8795-1bef-e85c4dbf21ee.png)

1. For Eachアクションで2.で設定した変数分ループするように設定
1. ループ内で、アクション「変数の設定」を使用し**１つのレコードに対して項目と値のリストを生成**
![JSON4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/63fc9abc-c7ce-e02e-2ccc-6f6038479be2.png)

1. 4で生成したリスト型変数から使用したい項目を指定して取り出す

### 最終的なフロー
![JSON5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/5843b94b-d178-021e-0247-f3bf0514c27e.png)


## 参考
https://www.youtube.com/watch?v=BuJXQTkldXs&t=3s

---
以上です。