---
title: "MapForceを使ったGroupon APIの処理 - 第2部"
date: "2011-08-16"
categories: 
  - "data-integration"
tags: 
  - "altova-xmlspy"
  - "data-integration"
  - "data-mapping"
  - "mapforce"
  - "missionkit"
  - "xml-editor"
  - "xml-schema"
  - "xmlspy"
description: Altova MapForceを使用して、Groupon APIを効果的に利用する方法を解説します。動的なデータマッピング、クエリの実行、および出力フィルタリング戦略について詳しく説明します。
---
Status: #blog

Tags:  #altova-xmlspy #data-integration #data-mapping #mapforce #missionkit #xml-editor #xml-schema #xmlspy

Categories: [data-integration](/blog/ja/category/data-integration.md)
# MapForceを使ったGroupon APIの処理 - 第2部

このシリーズの[第1部](https://www.altova.com/blog/2011/08/processing-groupon-api-with-altova.html)では、[Altova MapForce](https://www.altova.com/ja/mapforce.html)をGroupon APIに接続する方法について説明しました。まず、APIに問い合わせてGrouponの各部門の一覧を取得し、その一覧を使って、各部門の現在のすべてのキャンペーンに関するAPIクエリを作成しました。今回は、作成した`/deals`クエリを実行し、その結果から最も興味深いデータを抽出します。以前に作成した`/deals`クエリの一覧は以下のようになります 

[![Altova MapForceによって生成された、Grouponやお得な情報に関する問い合わせの一覧](https://lh3.ggpht.com/-DuCz6NmnbUQ/Tkkced-kKNI/AAAAAAAAAdc/6GOLTV7epMk/clip_image001_thumb.png?imgmax=800 "List of Groupon /deals queries generated by Altova MapForce")](http://lh3.ggpht.com/-2Z-nwIU-LKI/TkkceMyFDeI/AAAAAAAAAdY/kDFXB-IdDhw/s1600-h/clip_image0013.png) 

すべての問い合わせを処理するために、このリストを動的なファイル入力として、新しいマッピングコンポーネントに接続することができます。以前、新しいコンポーネントが必要になった際、API/部門に関する問い合わせをマッピングに追加し、MapForceにXMLスキーマを自動的に作成させました。今回も、同様にAPI/取引に関する問い合わせをXML入力ファイルとして追加することができます。ただし、わずかな問題点があります。GrouponのAPIに関するオンラインドキュメントでは、実行できる問い合わせについて明確に説明されていますが、返される情報については曖昧です。現在実施中のすべての取引について、数十件の問い合わせをAPIに送信する前に、返ってくるデータについてもう少し詳しく知っておく必要があるでしょう。 

**条件交渉しましょう** 

ヨギ・ベラが言ったように、ただ観察するだけでも多くのことがわかります。まずは、〇〇（具体的なツールやプラットフォーム名）で「deals」というキーワードで検索してみましょう [XMLSpy](https://www.altova.com/ja/xmlspy.html). これにより、大量のデータを処理する前に、ある特定の部門に対するクエリの応答を確認することができます。XMLSpyの「ファイル」/「開く」メニューには、以前の投稿でMapForceで使用したのと同じ「URLに切り替え」オプションが含まれています。もし、広大な都市圏をカバーするある部門（例えば、ダラス）に対する`/deals` APIクエリを実行すると、十分な数の取引データが得られる可能性があり、それらを用いてデータセット全体の特性を推測することができます。XMLSpyは、`/deals` APIクエリに対する応答を、ローカルファイルを開くのと同じように、テキスト表示で開きます 

[![以下は、Grouponや類似の割引サービスに関する問い合わせに対する回答例で、XMLSpyで表示されたものです](https://lh5.ggpht.com/-yuh3IG08N-M/TkkceylAHBI/AAAAAAAAAdk/v85ydqJD_IY/clip_image002_thumb.png?imgmax=800 "Response to a Groupon /deals query, shown in XMLSpy")](http://lh6.ggpht.com/-Eb1X5J799Yo/Tkkce1ixmfI/AAAAAAAAAdg/8gDhEldnKco/s1600-h/clip_image0023.png) 

予想通り、特定の部門に関する全ての取引データを要求した結果、大量のデータが得られました。このデータの構造を効率的に分析するためには、XMLSpyのDTD/スキーマメニューオプションを使用して、XMLファイルから.xsdファイルを生成する方法が有効です。以下に、ダラスに関する/dealsクエリに対する応答に基づいて生成された.xsdファイルの一部を表示します 

[![XMLSpyを使用して、Grouponのクエリから生成されたXSDファイル](https://lh5.ggpht.com/-kphWHOIh5FY/Tkkcfq0x1rI/AAAAAAAAAds/wP2tm-rh3sU/clip_image004_thumb.jpg?imgmax=800 "An XML Schema generated by XMLSpy from the Groupon query")](http://lh5.ggpht.com/-nFAolywZOlU/TkkcfVfixfI/AAAAAAAAAdo/ixbMzb4FjMM/s1600-h/clip_image0043.jpg) 

さらに深く掘り下げてみましょう。ヨギのアドバイスに従い、まるでデジャヴのように、XMLスキーマの要素を一つ一つ確認していくと、いくつかの興味深い異常が見つかります。例えば、同じく「redemptionLocation」という名前の要素ですが、定義が異なるものが二つ存在します。最初の要素には、子要素が順番に並んでいます 

[![「remdemptionLocation」要素の最初の使用例](https://lh3.ggpht.com/-3_iJQ8vMJv4/TkkcgPTVebI/AAAAAAAAAd0/H5Y0Y4UhYag/clip_image005_thumb.png?imgmax=800 "First use of the remdemptionLocation element")](http://lh5.ggpht.com/-Ds65S--pYGo/Tkkcf6t47qI/AAAAAAAAAdw/ctfBMJDvkSI/s1600-h/clip_image0053.png) 

そして、2番目のものは、単純な文字列として定義されます 

[![「remdemptionLocation」要素の再利用について](https://lh5.ggpht.com/-0f6ygtVStac/TkkcgsChc0I/AAAAAAAAAd8/kP4MfwN-nbo/clip_image006_thumb.png?imgmax=800 "Second use of the remdemptionLocation element")](http://lh6.ggpht.com/-TnjeC_B-xwo/TkkcgaD3N4I/AAAAAAAAAd4/QPsqdCH3_G8/s1600-h/clip_image0063.png) 

ダラスに関するXMLデータに戻り、"redemptionLocation" を検索すると、以下のような例が表示されます 

[![償いの例：応答本文内の位置](https://lh3.ggpht.com/-_jeVWegS2_E/TkkchCwxMBI/AAAAAAAAAeE/-WTenar_XWk/clip_image007_thumb.png?imgmax=800 "One example of redemptionLocation in the body of the response")](http://lh6.ggpht.com/-u8aUGljt0ak/Tkkcgyld0pI/AAAAAAAAAeA/BZPUZ9pzTvM/s1600-h/clip_image0073.png) 

そして： 

[![償いの例：応答本文内の位置](https://lh4.ggpht.com/-NmUZPlUkkZI/TkkchXZRqgI/AAAAAAAAAeM/PCRMkYPZYgE/clip_image008_thumb.png?imgmax=800 "One example of redemptionLocation in the body of the response")](http://lh6.ggpht.com/-0qhiOg-24LI/TkkchKG4nOI/AAAAAAAAAeI/LP_XSf5LwCM/s1600-h/clip_image0083.png) 

そして：

[![償いの例：応答本文内の位置](https://lh3.ggpht.com/-NwOgfSsxWmo/Tkkch7Nu2_I/AAAAAAAAAeU/DxwKHSBh6i8/clip_image009_thumb.png?imgmax=800 "One example of redemptionLocation in the body of the response")](http://lh4.ggpht.com/-ZPjMwCObxk0/TkkchpHYZiI/AAAAAAAAAeQ/wlLAu6yhnyY/s1600-h/clip_image0093.png) 

これは非常に興味深い点です。なぜなら、redemptionLocation = "online" と指定することで、特定の店舗への訪問を必要とせず、どこからでも利用できるお得な情報のみを表示するように設定できるからです。もし、すべての部門に対して /deals API を実行し、オンラインで利用できるすべての情報をリスト化したらどうでしょうか？それはまさに究極のグルーポンと言えるでしょう！

**必要な情報のみを要求する**
グルーポン /deals API のクエリには、オプションのパラメータ "&show=" があり、これによりユーザーは返されるデータを制限できます。このパラメータを使用することで、不要なデータを API の応答から除外し、帯域幅を節約し、データ変換にかかる処理時間を短縮できます。また、グルーポンウェブページのリンクなど、最も興味深い情報のみを含めることで、最終的な結果を簡素化することも可能です。生成されたダラススキーマから不要な要素を取り除いた後、オンラインでの特典に関する要約の最終的なバージョンは以下のようになります 

[![XMLSpyで作成された、簡略化されたGroupon XSDファイルのスキーマ図](https://lh4.ggpht.com/-iwVlq7FJKaI/TkkciR_RWlI/AAAAAAAAAec/40tefse9cdU/clip_image010_thumb.png?imgmax=800 "XMLSpy Schema diagram of the simplified Groupon xsd file")](http://lh3.ggpht.com/-lj5Ou5l1F2I/TkkciBixtCI/AAAAAAAAAeY/ZPWD35XiU1Q/s1600-h/clip_image0103.png) 

MapForceのマッピングに、簡略化されたXMLスキーマに含まれる要素のみを取得するための "&show=" パラメータを追加した場合、クエリは以下のようになります

[![&show= パラメータを使用した、検索クエリの一覧（修正版）](https://lh6.ggpht.com/-U_NgQfTyMSI/Tkkci5k9peI/AAAAAAAAAek/a_K8X4pljQ8/clip_image011_thumb.png?imgmax=800 "Modified list of queries with the &show= parameter")](http://lh5.ggpht.com/-k15Fug8YlDM/TkkciuNh8TI/AAAAAAAAAeg/z-vZ8UXA9uE/s1600-h/clip_image0113.png) 

今、修正された.xsdファイルをマッピングに配置し、APIや取引に関するクエリの一覧を動的な入力として接続することができます。以前にクエリの一覧を収集するために使用していたテキストファイルは削除する必要はありません。将来のデバッグ作業で役立つ可能性があるため、そのままにしておくと良いでしょう。 

[![MapForceにおける動的な入力ファイルのマッピング機能](https://lh5.ggpht.com/-1UHiT_Wo7wk/TkkcjQ4eRUI/AAAAAAAAAes/cIED363B0lM/clip_image012_thumb.png?imgmax=800 "Mapforce dynamic input file mapping")](http://lh5.ggpht.com/-yVH1tV-Hxww/TkkcjLLDrYI/AAAAAAAAAeo/kjoWneA91N8/s1600-h/clip_image0123.png) 

これらの変更により、データマッピングの入力側の作業が完了します。 

**データ変換の出力内容の定義** 

XMLSpyに戻り、入力XMLスキーマに対してさらにいくつかの修正を加えることで、出力用の新しいバージョンを設計することができます 

[![XMLSpyで生成された、出力ファイル（xsd形式）のスキーマ図](https://lh4.ggpht.com/-Ay_3WyFqFA8/Tkkcj1lL4eI/AAAAAAAAAe0/MbDOLQIx_eY/clip_image013_thumb.png?imgmax=800 "XMLSpy schema diagram of the output file xsd")](http://lh3.ggpht.com/-GpaXSUZ0Rvc/TkkcjsBzMVI/AAAAAAAAAew/8C0GzH_Y22A/s1600-h/clip_image0133.png) 

不要なレスポンス要素は削除し、出力に含める予定のない「redemptionLocation」要素も取り除きました。また、出力ファイルが常に変化するデータのスナップショットであるため、タイムスタンプを示す「date」要素を追加しました。 

この.xsdファイルをXMLSpyに保存した後、それをMapForceのマッピングに組み込むことができます。以下に、マッピングの出力側の一部を示します。出力コンポーネントは一部接続されています。上部のフィルターは、"redemptionLocation"要素を読み込み、オンラインでのみ利用可能な特典を選択します。また、"now"関数は現在の日付を挿入します

[![MapForceの出力ファイルのマッピングの一部の表示](https://lh3.ggpht.com/-dCMzbcgoV7o/TkkckSog8tI/AAAAAAAAAe8/E3WXT_hufz0/clip_image014_thumb.png?imgmax=800 "Partial view of the MapForce output file mapping")](http://lh4.ggpht.com/-Bw3lJz0IGRY/TkkckIAeytI/AAAAAAAAAe4/wRJ4iBcFJVY/s1600-h/clip_image0143.png) 

出力XMLスキーマにおける最後の修正は、いくつかの要素のデータ型をdateTime、Boolean、およびintegerから文字列型に変更したものです。これにより、より詳細なテキストを記述できるようになりました。以下に、出力コンポーネントとの最終的な関連付けを含む、マッピングの完全な定義を示します 

[![Mapforceを使用した、Groupon APIのデータマッピング](https://lh4.ggpht.com/-nqTnqO-22FQ/Tkkck9jjGMI/AAAAAAAAAfE/S98nV4FP7uE/clip_image015_thumb.png?imgmax=800 "Mapforce data mapping for the Groupon API")](http://lh5.ggpht.com/-Pb7a5H2UpFs/TkkcknIB9_I/AAAAAAAAAfA/rsYL1Q1NHUk/s1600-h/clip_image0153.png) 

**さて、いよいよ本題に入ります** 

「出力」ボタンをクリックすると、MapForceは、組み込みの実行エンジンを使用して、マッピング全体を最初から最後まで処理します。以下に、その手順の概要を示します

- `/divisions` コマンドを実行して、現在の部門リストを取得してください
- すべての部門に対する "/deals" クエリのリストを作成するために、文字列を連結します
- `/deals` クエリを実行して、入力コンポーネントで使用するための動的なデータを作成します
- オンラインでの割引情報をフィルタリングし、その結果に基づいて出力コンポーネントを生成します。その後、残りのマッピング関数を実行し、すべての割引情報が処理された後にタイムスタンプを追加します

MapForceは、これらのすべての処理をわずか数秒で完了し、以下のような一連の取引情報を含む出力ファイルを作成します 

[![MapForceのマッピング機能を使用して、Groupon APIから取得したデータを変換・出力します](https://lh5.ggpht.com/-nLw5_EH7G-c/TkkclUU6KzI/AAAAAAAAAfM/_GNvvf-Mlqc/clip_image016_thumb.png?imgmax=800 "Output data from the MapForce mapping for the Groupon API")](http://lh6.ggpht.com/-GkEs7wJOvcs/TkkclJCUb0I/AAAAAAAAAfI/eXjcgRriFbY/s1600-h/clip_image0163.png)

このシリーズの第3回では、作成したマッピングのXML出力を、ウェブブラウザやモバイルデバイスで美しく表示できるよう、自動的にHTMLに変換するスタイルシートを設計します。それでは、また球場で会いましょう、ヨギ！ 

XMLSpyとMapForceは、特別価格で提供されているAltova MissionKitにセットで含まれています。MissionKitを使って、ウェブAPIからデータを変換するがいかに簡単であるか、ぜひご自身で体験してみてください [30日間の無料トライアルをダウンロード！](https://www.altova.com/ja/download/missionkit/software_development_tools_enterprise.html) 

**編集後記：** 弊社のGroupon APIから取得したデータを活用したオリジナルシリーズは、3つのパートで構成されており、以下のリンクをクリックして各パートをご覧ください。パート1： [Altova MapForce を使用した Groupon API の処理](https://www.altova.com/blog/2011/08/processing-groupon-api-with-altova.html) 複数のURLからデータを収集することで、動的な入力を作成する方法について説明します。 [MapForceを使ったGroupon APIの処理 - 第2部](https://www.altova.com/blog/2011/08/processing-groupon-api-with-mapforce.html) APIから取得したデータをどのようにフィルタリングし、必要な情報のみを抽出するために、出力形式をどのように定義したかを説明します。 [Groupon APIの利用方法 - 第3部](https://www.altova.com/blog/2011/08/processing-groupon-api-part-3.html) この機能は、出力結果をデスクトップ環境とモバイルデバイスの両方で最適化された単一のHTMLドキュメントとして整形する方法について説明し、繰り返し実行を自動化するための方法についても解説しています。
