はじめに
- 本記事は、HTTP要求アクティビティをXML形式で利用した際のメモです。
- XML関連のアクティビティは「Windows - レガシ」プロジェクトで動作します。 私が確認する限り、.NET6系の「Windows」プロジェクトでは Element の操作等で期待結果が得られません。
- 例示のため、Geocoding.jp API をつかわせていただいています。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 23.4 バージョンで構成しています。
XML とは
次のサンプルの様に、見た目はHTMLっぽい感じで、値が項目名のタグに囲われています。
後述するアクティビティが何のためのものかをイメージしやすくするために、「ノード」と「属性」の対応も図解・補足します↓↓
HTTP要求アクティビティでの操作メモ
プロパティ(設定)
「本文形式」や「受け入れ形式」にXML形式を指定します。
「本文(リクエストボディ)」にXML形式のパラメータをセットしますが、先のサンプルでいう
<?xml version="1.0" encoding="UTF-8" ?>
は不要なのでご注意ください。※ルートノード以下を指定します。
「本文」へはエディタで改行コードを除いたテキストを指定しても、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&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コマンドの参考記事)
データ(値)取得
データの取得方法を説明するため、今回は Geocoding.jp API を使わせていただきます↓↓
簡単なリクエストを送信するだけでXML形式のレスポンスを得られます↓
お馴染みHTTP要求を配置し、とりあえずレスポンス(応答コンテンツ)のXMLを受け取ります。
次に、「XMLを逆シリアル化」をもちいて XDocument というオブジェクトをつくります。
そして、「XMLノードを取得」で先に XDocument 化した XMLオブジェクトをさらに XMLノードオブジェクトにします。
XMLノードオブジェクトを繰り返しで出力するとこう↓
次に、任意の項目の値の取り方。
ノード2 の「coordinate」の「lat」の値をとりたい場合、繰り返し(コレクションの各要素)のインプットに
『XMLドキュメント.Element("result").Elements("coordinate")』
を、TypeArgument に『System.Xml.Linq.XElement』を指定します。
あとは『item.Element("lat").Value.ToString』の様に記述すれば値取得できます。
最後に「XMLノード属性を取得」について
今回使ったWebAPIのレスポンスには属性が含まれていなかったので、公式ガイドのサンプルで補足します。
読み込むXMLの最初のノードの「title」が属性情報を持っています。
XMLノード属性オブジェクトを生成したら、あとはインデックスとメソッド(項目名:.Name / 値:.Value)を指定するだけ
おまけ
Windowsプロジェクトで開発中、またはWebAPIサービス側の仕様とのミスマッチ等で XDocument の操作で期待結果が得られないときは、スマートではありませんが「一致する文字列を取得」アクティビティなどでとりあえず回避実装することもできます。
XMLは項目名のタグで括られているので、「<タグ名>.*?タグ名>」を出力して、「{出力変数}.Replace("<タグ名>","").Replace("タグ名>","")」で値を取得することもできます。
値のデータ長などが固定の場合は、「応答コンテンツ.Substring(応答コンテンツ.IndexOf("<タグ名>"),12)」などと記述することで簡単に取得してもよいかもしれません。
参考ガイド