こんにちは。CData Software Japanの色川です。
この記事では、CData Arc のコアコネクタの1つであるXSLT コネクタをご紹介します。
CData Arc のXSLT コネクタは、指定したXSL ファイルの定義に従ってXML 構造を自動的に変換できるコネクタです。
cdn.arcesb.com
現在REST スタイルで提供されているAPI は多いですが、REST スタイルのAPI と一口に言っても、扱いやすいモノからそうでないモノまで様々です。
中には少々扱いにくいレスポンスが返ってくるケースもありますが、そういった扱いにくいデータ構造を相手に連携フローを組んでいくのは開発も維持もなかなか大変です。そういった時は無理にそのまま扱わず、まずは扱いやすいデータ構造に変換してしまうのも1つのアプローチだと思います。XSLT コネクタはそんな時にも活用できます。
この記事のシナリオ
この記事では、こちらのセッションで触れている「奇妙なレスポンス形式」を持つAPI と連携しなければならなくなった時を例にして、XSLT コネクタを活用して連携フローを作成してみます。
speakerdeck.com
(あまり出会いたくない)扱いにくいレスポンス形式については、こちらの記事も併せてご覧ください。
qiita.com
この記事で扱うフロー
CData Arc では連携フローを流れるメッセージの形式としてXML を利用しています。REST コネクタなどで「API をコールしてJSON が返されたら、JSON コネクタでXML に変換して後続のフローに連携していく」のは良くあるパターンです。
この記事では「API から返されたJSON をデータベースへUpsert する」シンプルなシナリオにしています。Upsert するテーブルはそのままマッピングすればOK の分かりやすい構造にしています。
このシンプルなシナリオで、奇妙なレスポンス形式(API から返されるJSON が扱いにくい形式)のとき、XSLT を利用して扱いやすいデータ構造に変えてから連携フローをつないでみます。
扱いやすいレスポンス形式の場合
まずは「奇妙なレスポンス形式」を扱う前に、一般的に期待される扱いやすいレスポンスを対象にしたときのフローです。
customer を返すAPI があるとして、このようなレスポンスだと素直に扱いやすいですよね。
{
"customer": [
{
"Id": "1",
"Name": "John",
"Gender": "M",
"Age": 21
},
{
"Id": "2",
"Name": "Tom",
"Gender": "M",
"age": 47
},
{
"Id": "3",
"Name": "Jane",
"Gender": "F",
"age": 34
}
]
}
データ構造をそのまま考えると、以下のような素直なテーブルイメージです。
CData Arc のJSON コネクタを通すと、以下のようなXML に変換されます。
xml version="1.0" encoding="utf-8"
xmlnsjson="http://arc.cdata.com/ns/jsonconnector"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance">
jsonarray="true">
1
John
M
jsontype="number">21
jsonarray="true">
2
Tom
M
jsontype="number">47
jsonarray="true">
3
Jane
F
jsontype="number">34
この形式であれば、その後のフローであるXML Map でのデータベースへのマッピングも素直で分かりやすく簡単です。
フロー自体は、以下のようなシンプルな流れです。
|
コネクタ |
内容 |
1 |
JSON |
(API レスポンスをイメージした)JSON ファイルの読み込みとXML への変換 |
2 |
XML Map |
1.の結果を3.にマッピング |
3 |
SQL Server |
SQL Server へUpsert |
奇妙なレスポンス形式の場合(キーが値になっている)
まずは、こちらのケースです。
{
"customer": {
"1": {
"Name": "John",
"Gender": "M",
"Age": 21
},
"2": {
"Name": "Tom",
"Gender": "M",
"Age": 47
},
"3": {
"Name": "Jane",
"Gender": "F",
"Age": 34
}
}
}
キーが値になっていて、そのまま変換すると以下のようなイメージになってしまいますよね。
このJSON ファイルは、JSON コネクタを通すと、以下のようなXML に変換されます。
xml version="1.0" encoding="utf-8"
xmlnsjson="http://arc.cdata.com/ns/jsonconnector"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance">
<__1>
John
M
jsontype="number">21
<__2>
Tom
M
jsontype="number">47
<__3>
Jane
F
jsontype="number">34
これでは、Mapping(XML Map)においても繰り返すレコード単位の判断ができませんし、扱いにくいです。
そこで、JSON コネクタでXML に変換されたデータを、以下のようなXSL で扱いやすい形に変換してみます。ここでは、/Items/customer 配下のノードを対象に、ノードの名前を customer Id の値とするように変換しています。
xml version="1.0" encoding="UTF-8"
<xslstylesheet xmlnsxsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsloutput method="xml" indent="yes" />
<xsltemplate match="/Items/customer/*">
<xslvalue-of select="translate(name(),'__','')" />
<xslvalue-of select="Name" />
<xslvalue-of select="Gender" />
<xslvalue-of select="Age" />
xsltemplate>
<xsltemplate match="/*">
<xslapply-templates />
xsltemplate>
xslstylesheet>
JSON コネクタの出力を、XSLT コネクタにつなぎます。
変換ロジックを定義したXSL ファイルをXSLT コネクタに指定します。
これにより、JSON コネクタでXML に変換したデータが、XSLT コネクタを通過すると、以下のようなXML に変換されます。
xml version="1.0" encoding="utf-8"
1
John
M
21
2
Tom
M
47
3
Jane
F
34
こうすれば、後続のフローは、先ほどと同じ「扱いやすいデータ構造」を相手にできますので、後続のMapping(XML Map)も素直で簡単です。
奇妙なレスポンス形式の場合(要素が離れている)
今度はこちらのケースです。
{
"customer": {
"Id": {
"0": "1",
"1": "2",
"2": "3"
},
"Name": {
"0": "John",
"1": "Tom",
"2": "Jane"
},
"Gender": {
"0": "M",
"1": "M",
"2": "F"
},
"Age": {
"0": 21,
"1": 47,
"2": 34
}
}
}
1人のcustomer を表す関連する要素が離れてしまっています。こちらはそのまま変換すると以下のようなイメージになってしまいますよね。
このJSON ファイルは、JSON コネクタを通すと、以下のようなXML に変換されます。
xml version="1.0" encoding="utf-8"
xmlnsjson="http://arc.cdata.com/ns/jsonconnector"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance">
<__0>1
<__1>2
<__2>3
<__0>John
<__1>Tom
<__2>Jane
<__0>M
<__1>M
<__2>F
<__0 jsontype="number">21
<__1 jsontype="number">47
<__2 jsontype="number">34
これでは、Mapping においても・・・先ほどと同じく扱いにくいですよね。
そこで、今度は以下のようなXSL を通して「扱いやすい形」に変換します。この例では、/Items/customer/Id 配下のノードを対象に、ノード名を条件としてName/Gender/Age それぞれのノード配下から同じノード名の値を取得してcustomer として変換しています。
xml version="1.0" encoding="UTF-8"
<xslstylesheet xmlnsxsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsloutput method="xml" indent="yes" />
<xsltemplate match="/Items/customer/Id/*">
<xslvariable name="i" select="name()"/>
<xslvalue-of select="current()" />
<xslvalue-of select="../../Name/*[name()=$i]" />
<xslvalue-of select="../../Gender/*[name()=$i]" />
<xslvalue-of select="../../Age/*[name()=$i]" />
xsltemplate>
<xsltemplate match="/Items/customer/Name"/>
<xsltemplate match="/Items/customer/Gender"/>
<xsltemplate match="/Items/customer/Age"/>
<xsltemplate match="/*">
<xslapply-templates />
xsltemplate>
xslstylesheet>
JSON コネクタでXML に変換したデータが、このXSL を指定したXSLT コネクタを通過すると、以下のようなXML に変換されます。
xml version="1.0" encoding="utf-8"
1
John
M
21
2
Tom
M
47
3
Jane
F
34
そうすれば、先の2つのフローと同じ「扱いやすいデータ構造」を相手にできますので、後続のフローも素直で簡単ですね。
おわりに
この記事では、奇妙なレスポンス形式を持つAPI と連携する(連携しなければならなくなった)時を例に、CData Arc のXSLT コネクタをご紹介しました。
CData Arc はシンプルで拡張性の高いコアフレームワークに、豊富なMFT・EDI・エンタープライズコネクタを備えたパワフルな製品です。CData Drivers との組み合わせで250を超えるアプリケーションへの連携を実現できます。必要な連携を低価格からはじめられる事も大きな特長です。
皆さんのつなぎたいシナリオでぜひ CData Arc を試してみてください。
arc.cdata.com
お試しいただく中で何かご不明な点があれば、テクニカルサポートへお気軽にお問い合わせください。
www.cdata.com
この記事では CData Arc™ 2021 - 21.0.8054
を利用しています。
関連コンテンツ