開発者コンソール

手順4: カテゴリーレシピ: queryパラメーター

手順4: カテゴリーレシピ: queryパラメーター

カテゴリーレシピの構成を続行して、queryパラメーターとqueryResultTypeパラメーターを設定しましょう。

queryパラメーター

使用する構文はJSONとXMLで異なります。自分のフィードに適したタブを参照してください。

JSONフィード

Fire App Builderのサンプルアプリは、JSON形式を使用した汎用的なLightCastメディアフィードを読み取ります。カテゴリーレシピでは、フィードからカテゴリーのリストを返すために、queryパラメーターの値として$..categories[*]を使用します。この構文はJayway JsonPath(英語のみ)の構文です。この特定のインスタンスでの構文の意味を以下に示します。

クエリ構文 一致する部分
$ ルートディレクトリを検索の開始位置として指定します。
.. ルートのすべてのディレクトリとサブディレクトリを対象に再帰検索を行うことを指定します。
categories[] 「categories」という名前の配列を検索することを指定します。
* すべてのコンテンツに一致します(ワイルドカード)。

これらをまとめると、$..categories[*]は、ルートから処理を開始し($)、すべてのディレクトリとサブディレクトリを再帰的に調べ(..)、categoriesという名前の配列を検索して、配列内に任意のコンテンツを含むもの(*)を返します。

クエリは、Jayway JsonPath Evaluator(英語のみ)を使用してテストできます。

Fire App Builderのサンプルアプリでは、デフォルトのLightCastフィードURLhttp://www.lightcast.com/api/firetv/channels.php?app_id=249&app_key=gtn89uj3dsw&action=channels_videos)に対してこのクエリ($..categories[*])を実行すると、結果として次のようなカテゴリー名の文字列配列が返されます。

[
   "Costa Rica Islands",
   "Costa Rica Underwater",
   "Costa Rica Islands",
   "Costa Rica Attractions",
   "Costa Rica Underwater",
   "Costa Rica Islands",
   "Costa Rica Attractions",
   "Costa Rica Underwater",
   "Costa Rica Islands",
   "Costa Rica Attractions",
   "Costa Rica Underwater",
   "Costa Rica Attractions",
   "Costa Rica Islands",
   "Costa Rica Underwater",
   "Costa Rica Attractions",
   "Costa Rica Islands",
   "Costa Rica Underwater",
   "Costa Rica Islands",
   ...
]

(Fire App Builderでは、クエリ結果から重複が削除されます。)

Jayway JsonPathで作成された別のクエリのサンプルとして、$.node[?(@.type == 'item')]について考えましょう。このクエリの例は、JSONオブジェクトのルートから、値が配列であるnodeキーを検索します。その配列内で、各アイテムのtypeの値を調べます。値がitemに等しければ一致と見なされ、結果として返されます。使用できる演算子(英語のみ)とその他の例については、Jayway JsonPathのドキュメント(英語のみ)を参照してください。

XMLフィード

フィードがXMLの場合、フィードの特定の要素をターゲットにするには、Jayway JsonPathではなくXPath式(英語のみ)を使用する必要があります。XPathは、XMLドキュメントをさまざまな「ノード」というアイテムに集約します。 XPath構文は、特定のノードの位置をターゲットにします。

次のような構造を含むXMLフィードがあるとします。

<rss>
    <channel>
        <item>
        <title>サンプルタイトル</title>
        <pubDate>Wed, 26 Oct 2016 20:34:22 PDT</pubDate>
        <link>https://example.com/myshow/episodes/110</link>
        <author>サンプル作者名</author>
        <category>テクノロジー</category>
        <category>ガジェット</category>
        </item>
    </channel>
</rss>

このフィードのカテゴリーを取得するには、次のXPath式を使用します。

//category/text()

//は、ノードが階層内のどこにあるかにかかわらず、すべてのノードで一致を再帰的に検索します。categoryはcategoryノードを選択し、text()はそのノードからテキストを選択します。

これをテストするには、XPath Tester/Evaluator(英語のみ)を使用します。式から次のようなレスポンスが返されます。

Text='テクノロジー'
Text='ガジェット'

Text=の部分は無視できます。これは単にXPath Testerの表示の一部であり、クエリで一致した内容ではありません。)

別のXPath式の例として、/node/item[index]について考えましょう。この例のクエリは、XMLオブジェクトのnode要素から開始して、値が配列であるitem要素を検索します。その配列内で、indexの位置にある要素を選択します。

XMLフィードをXPath Tester/Evaluator(英語のみ)にコピーし、同様の構文を使用してカテゴリーを選択してみてください。

XPath式の詳細については、XPath Syntax(英語のみ)と、XPath Examples(英語のみ)の例のセクションを参照してください。

名前空間付き要素のターゲット指定

<media:category>Media RSS仕様(英語のみ)で必要)や<itunes: category text="Apples"/>iTunesのRSSタグ(英語のみ)で必要)など、名前空間付きの要素をFire App Builderのqueryパラメーターでターゲットにする場合は、すべてのXPath式が機能するとは限りません。以下の2つのセクションでは、そのガイダンスを提供します。

Media RSSのカテゴリーの例

たとえば、Media RSS仕様に準拠した次のようなXMLフィードがあるとします。

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
   <channel>
      <title>MRSSフィードのサンプル</title>
      <link>https://some-site.com/mrss.xml</link>
      <language>ja-jp</language>
      <description>Amazonテスト用MRSSフィード</description>
      <atom:link href="https://some-site.com/mrss.xml" rel="self" type="application/rss+xml" />
      <item>
         <title>2018年5月18日 - リンゴ</title>
         <description>2018年5月18日。おいしい果物、リンゴ。リンゴの栽培と生産についての楽しいドキュメンタリーをご覧ください。</description>
         <pubDate>Thu, 31 May 2018 22:45:38 GMT</pubDate>
         <guid>https://some-site.com/apples.mp4</guid>
         <itunes:subtitle>2018年5月18日。おいしい果物、リンゴ。リンゴの栽培と生産についての楽しいドキュメンタリーをご覧ください。</itunes:subtitle>
         <media:category>農業</media:category>
         <media:content url="https://some-site.com/apples.mp4" type="application/mp4" medium="video" duration="2610.688" isDefault="true">
            <media:title>2018年5月18日 - リンゴ</media:title>
            <media:description>2018年5月18日。 おいしい果物、リンゴ。リンゴの栽培と生産についての楽しいドキュメンタリーをご覧ください。</media:description>
            <media:thumbnail url="http://some-site.com/thumbnails/apples.jpg" height="393" width="699" />
         </media:content>
      </item>
      <item>
         <title>2018年5月23日 - バナナ</title>
         <description>2018年5月23日。魅力が詰まったバナナ。バナナの栽培方法についての興味深いドキュメンタリーをご覧ください。</description>
         <pubDate>Thu, 31 May 2018 22:45:41 GMT</pubDate>
         <guid>https://sample-server..net/3024343431/2234305/2345/3024422184001_3473874.mpd</guid>
         <itunes:subtitle>2018年5月23日。魅力が詰まったバナナ。バナナの栽培方法についての興味深いドキュメンタリーをご覧ください。</itunes:subtitle>
         <media:category>ライフスタイル</media:category>
         <media:content url="https://some-site.com/bananas.mp4" type="application/mp4" medium="video" duration="2610.688" isDefault="true">
            <media:title>2018年5月18日 - リンゴ</media:title>
            <media:description>2018年5月18日。魅力が詰まったバナナ。バナナの栽培方法についての興味深いドキュメンタリーをご覧ください。</media:description>
            <media:thumbnail url="http://some-site.com/thumbnails/bananas.jpg" height="393" width="699" />
         </media:content>
      </item>
   </channel>
</rss>

<media:category>要素をターゲットにする場合、次のクエリは使用できません。

"query": "//item/media:category/text()"

この構文はXPath Tester(英語のみ)では機能しますが、Fire App Builderで同じXPathパーサーが使用されるわけではありません。このため、代わりに次の構文を使用する必要があります。

"query": "//*[name()='media:category']/text()"

これも標準のXPath式の構文です。ここでは//を使用して、条件に一致するすべてのノードを(すべての階層から)選択します。*は、任意のノードに一致するワイルドカードです。[name()='media:category']は、media:categoryという名前の要素を選択します。text()は、要素のテキストを取得します。

名前空間に関するこの特別な構文制限は、queryパラメーターにのみ適用されます。matchListパラメーター(次の手順で説明)ではXPath式は使用されません。

iTunesのRSSタグの例

たとえば、iTunesのRSSタグに準拠した次のようなフィードがあるとします。

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" version="2.0" xml:base="http://www.nasa.gov/">
   <channel>
      <title>サンプル1</title>
      <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.Sed tincidunt vehicula placerat.Nunc eget auctor leo.Donec vitae neque vehicula, fermentum risus et, scelerisque felis. </description>
      <link>http://www.example.org/</link>
      <itunes:subtitle>Quisque egestas nec metus ac ullamcorper.In a semper ex, vulputate pellentesque massa.</itunes:subtitle>
      <itunes:summary>Lorem ipsum dolor sit amet, consectetur adipiscing elit.Sed tincidunt vehicula placerat.Nunc eget auctor leo.Donec vitae neque vehicula, fermentum risus et, scelerisque felis. </itunes:summary>
      <itunes:category text="果物" />
      <itunes:keywords>果物, バスケット, 農園</itunes:keywords>
      <itunes:image href="https://www.example.org/images/somelogo.png" />
      <item>
         <title>ウィークリーニュース(2018年8月11日)</title>
         <link>http://www.example.org/weeklynews/august-18-2018.html</link>
         <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.Sed tincidunt vehicula placerat.Nunc eget auctor leo.Donec vitae neque vehicula, fermentum risus et, scelerisque felis. </description>
         <enclosure url="https://amzndevresources.com/fire-app-builder/media/bunny.mp4" length="44842035" type="video/mp4" />
         <guid isPermaLink="false">august-11-2018</guid>
         <pubDate>Sat, 11 Aug 2018 09:00 EDT</pubDate>
         <source url="http://example.org.rss">ビデオの例</source>
         <itunes:category text="リンゴ" />
         <itunes:image href="https://amzndevresources.com/fire-app-builder/media/card.png" />
      </item>     
      <item>
         <title>ウィークリーニュース(2018年8月30日)</title>
         <link>http://www.example.org/weeklynews/august-18-2018.html</link>
         <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.Sed tincidunt vehicula placerat.Nunc eget auctor leo.Donec vitae neque vehicula, fermentum risus et, scelerisque felis. </description>
         <enclosure url="https://amzndevresources.com/fire-app-builder/media/bunny.mp4" length="44842333" type="video/mp4" />
         <guid isPermaLink="false">august-12-2018</guid>
         <pubDate>Sat, 12 Aug 2018 09:00 EDT</pubDate>
         <source url="http://example.org.rss">ビデオの例</source>
         <itunes:category text="オレンジ" />
         <itunes:image href="https://amzndevresources.com/fire-app-builder/media/card.png" />
      </item>  
   </channel>
</rss>

iTunesフィードには、フィードに適用される全般的なカテゴリー(<itunes:category text="果物">)と、アイテムごとのカテゴリー(<itunes:category text="リンゴ" />)があります。レシピでカテゴリーをターゲットにするときは、通常、全般的なフィードカテゴリー自体ではなく、フィードの各itemのカテゴリーをターゲットにします。

<itunes:category text="リンゴ" />を選択するには、カテゴリーレシピで次のクエリを使用します。

"query": "/rss/channel/item//*[name()='itunes:category']"

これにより、目的のカテゴリー名だけでなく、カテゴリー要素全体が返されます。

<itunes:category xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" text="リンゴ"/>'
<itunes:category xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" text="オレンジ"/>'

次に、レシピでmatchListパラメーター(次の手順で説明)を使用して、実際の属性を選択できます。たとえば、カテゴリーレシピは次のようになります。

{
  "cooker": "DynamicParser",
  "format": "xml",
  "model": "com.amazon.android.model.content.ContentContainer",
  "translator": "ContentContainerTranslator",
  "modelType": "array",
  "query": "/rss/channel/item//*[name()='itunes:category']",
  "queryResultType": "[]$",
  "matchList": [
    "#attributes/text@mName"
  ],
  "keyDataType":"#attributes/text@keyDataPath"
}

queryResultTypeパラメーター

Fire App Builderでは、queryパラメーターから結果を取得し、HashMapに変換して、Javaクラスで処理する必要があります。結果をオブジェクトの配列に変換するには、queryResultTypeパラメーターが使用されます。Fire App Builderのサンプルアプリでは、queryResultTypeの値は次のようになっています。

"queryResultType": "[]$",

この場合、queryパラメーターの結果は文字列のリストです。構文[]$は、これらの文字列を処理できるようにHashMapに変換します。

queryパラメーターの結果が文字列のリストを返す場合は、カテゴリーレシピにqueryResultTypeパラメーターを含めて、その値を[]$に設定します。クエリの結果が既にオブジェクト(マップ)である場合は、このパラメーター全体を省略します。

次のステップ

カテゴリーレシピを完成させるには、matchListパラメーターとkeyDataTypeパラメーターを構成する必要があります。次の手順の カテゴリーレシピ: matchListパラメーターに進みます。


Last updated: 2022年3月16日