【HTTP要求アクティビティ】XMLフォーマットの扱い方メモ

# はじめに

- 本記事は、HTTP要求アクティビティをXML形式で利用した際のメモです。
- ***XML関連のアクティビティは「Windows - レガシ」プロジェクトで動作します。*** 私が確認する限り、.NET6系の「Windows」プロジェクトでは Element の操作等で期待結果が得られません。
- 例示のため、[***Geocoding.jp API***](https://www.geocoding.jp/api/) をつかわせていただいています。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 23.4 バージョンで構成しています。

# XML とは

次のサンプルの様に、見た目はHTMLっぽい感じで、***値が項目名のタグに囲われています。***
後述するアクティビティが何のためのものかをイメージしやすくするために、***「ノード」と「属性」の対応***も図解・補足します↓↓
![XML_HTTP要求0.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/15d30cf7-c887-ba49-dfd5-98ae87864a98.jpeg)

# HTTP要求アクティビティでの操作メモ

## プロパティ（設定）

「本文形式」や「受け入れ形式」にXML形式を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/89ba3433-bf31-398d-8f04-b06790cb9b79.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/2b970a8e-427e-6437-e4f3-0782747b22f6.png)
「本文（リクエストボディ）」にXML形式のパラメータをセットしますが、先のサンプルでいう
```
<?xml version="1.0" encoding="UTF-8" ?>
```
は不要なのでご注意ください。***※ルートノード以下を指定します。***

::: note
「本文」へはエディタで改行コードを除いたテキストを指定しても、Environment.Newline や vbCrLf 等で改行したものを指定してもOKです。
```
<result><version>1.2</version><address>志村坂上</address><coordinate><lat>35.775769</lat><lng>139.695387</lng><lat_dms>35,46,32.769</lat_dms><lng_dms>139,41,43.395</lng_dms></coordinate><coordinate_tokyo><lat>35.772544</lat><lng>139.698605</lng><lat_dms>35,46,21.16</lat_dms><lng_dms>139,41,54.977</lng_dms></coordinate_tokyo><open_location_code>8Q7XQMGW+85</open_location_code><url>https://www.geocoding.jp/?q=%E5%BF%97%E6%9D%91%E5%9D%82%E4%B8%8A&amp;d=tokyo</url><needs_to_verify>yes</needs_to_verify><google_maps>志村坂上駅</google_maps></result>
```
```
（例）
"<result>" + Environment.Newline + 
"<version>1.2</version>" + Environment.Newline + 
"<address>志村坂上</address>" + Environment.Newline + 
・・・
```
:::

アクティビティの記述（設定内容）に不安がある場合、別のツールなどでリクエストを試すのをお勧めします。（以下は、curlコマンドの参考記事）

https://fumidzuki.com/knowledge/3522/

## データ（値）取得

データの取得方法を説明するため、今回は [***Geocoding.jp API***](https://www.geocoding.jp/api/) を使わせていただきます↓↓
![XML_HTTP要求2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a8ffc6c2-f113-2f5a-1cc9-2163a7351738.jpeg)
簡単なリクエストを送信するだけでXML形式のレスポンスを得られます↓
![XML_HTTP要求4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/fe437257-a92b-a10c-242f-0a4ffe86a54e.jpeg)
お馴染みHTTP要求を配置し、とりあえずレスポンス（応答コンテンツ）のXMLを受け取ります。
![XML_HTTP要求7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/ffb0392a-ccf5-4601-6db7-10f33bb7918e.jpeg)
![XML_HTTP要求8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/b33b1a80-6bde-22e1-54ac-321ca55a3a17.jpeg)
次に、「XMLを逆シリアル化」をもちいて XDocument というオブジェクトをつくります。
そして、「XMLノードを取得」で先に XDocument 化した ***XMLオブジェクトをさらに XMLノードオブジェクトにします。***
![XML_HTTP要求9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/42e55b99-e2a4-5bb5-ca3a-560dce561769.jpeg)
XMLノードオブジェクトを繰り返しで出力するとこう↓
![XML_HTTP要求10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/07ca711e-6f25-aee7-7f81-4aa40316e465.jpeg)

次に、任意の項目の値の取り方。
ノード2 の「coordinate」の「lat」の値をとりたい場合、繰り返し（コレクションの各要素）のインプットに
『***XMLドキュメント.Element("result").Elements("coordinate")***』
を、TypeArgument に『***System.Xml.Linq.XElement***』を指定します。
あとは『***item.Element("lat").Value.ToString***』の様に記述すれば値取得できます。
![XML_HTTP要求12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/6c7db733-9ecb-aa16-2d40-aa41ee633f84.jpeg)
最後に「XMLノード属性を取得」について
![XML_HTTP要求14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/eef4feb7-84e5-0742-8ab6-46addecbfb43.jpeg)
今回使ったWebAPIのレスポンスには属性が含まれていなかったので、公式ガイドのサンプルで補足します。
読み込むXMLの最初のノードの「title」が属性情報を持っています。
![XML_HTTP要求15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/822cd7b7-dbc5-1c19-0716-0dabf303aa90.jpeg)
XMLノード属性オブジェクトを生成したら、あとはインデックスとメソッド（項目名:.Name / 値:.Value）を指定するだけ
![XML_HTTP要求13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e85d35c6-390a-365b-537c-9c6e68998b31.jpeg)

## おまけ

Windowsプロジェクトで開発中、またはWebAPIサービス側の仕様とのミスマッチ等で XDocument の操作で期待結果が得られないときは、スマートではありませんが「***一致する文字列を取得***」アクティビティなどでとりあえず回避実装することもできます。
XMLは項目名のタグで括られているので、「<タグ名>.*?</タグ名>」を出力して、「{出力変数}.Replace("<タグ名>","").Replace("</タグ名>","")」で値を取得することもできます。
![XML_HTTP要求16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/183cf3c7-b1ad-a4b4-f7e6-2f67ad4ed56f.jpeg)

値のデータ長などが固定の場合は、「***応答コンテンツ.Substring(応答コンテンツ.IndexOf("＜タグ名＞"),12)***」などと記述することで簡単に取得してもよいかもしれません。
![XML_HTTP要求17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/52f37805-a401-ae2e-c03c-9cfde8d3438c.jpeg)

# 参考ガイド

https://docs.uipath.com/ja/activities/other/latest/developer/read-and-deserialize-a-xml-file