.NET TIPS

[ASP.NET]XmlDataSourceコントロールでYahoo!検索ウェブサービスを利用するには?[2.0のみ、C#、VB]

山田 祥寛
2006/07/28

 「Yahoo! 検索ウェブサービス」は、先般、Yahoo!が公開したサービスの1つだ。本サービスを利用することで、Yahoo!が提供している膨大なサイト情報データベース、検索エンジンの機能を、あたかも自前のアプリケーションであるかのように利用できるというわけだ。

 本稿では、この「Yahoo! 検索ウェブサービス」をWebフォームから利用する方法について紹介する。

●「Yahoo! 検索ウェブサービス」の概要

 具体的な手順に入る前に、簡単に「Yahoo! 検索ウェブサービス」の概略を示しておく。

 本サービスはREST(REpresentational State Transfer)ベースで実装されており、HTTPリクエストに検索キーワードなど必要なパラメータを指定することで、検索結果をXML形式のデータとして受け取ることができる。試しに、ブラウザから「Yahoo! 検索ウェブサービス」にアクセスしてみよう。以下のURLをクリックしてほしい。

http://api.search.yahoo.co.jp/WebSearchService/V1/
webSearch?appid=wings-project&query=WINGSプロジェクト

 URLの「http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?」の部分は「Yahoo! 検索ウェブサービス」を利用するためにあらかじめ決められたURLだ。このURLに対して、必要なパラメータをクエリ文字列の形式で引き渡してやるだけでよい。最低限の検索機能を実装するだけならば、まずは「appid(アプリケーションID)」と「query(検索文字列)」だけを指定しておけば問題ないだろう。

 アプリケーションIDとは、サービスを利用するアプリケーションを識別するキーとなるもので、「Yahoo! デベロッパーネットワークから取得が可能だ。適宜、自分のアプリケーションIDを取得しておく必要がある。そのほか、利用可能なパラメータとその意味については、「Yahoo!デベロッパーネットワーク - ウェブ検索」を参照していただきたい。

 検索キーワードにマッチした結果が、以下のようにXMLデータとして取得できれば成功だ。結果XMLに含まれる要素や属性の意味についても、前掲のページを参照のこと。

<?xml version="1.0" encoding="UTF-8" ?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="urn:yahoo:jp:srch"
  xsi:schemaLocation="urn:yahoo:jp:srch http://api.search.yahoo.co.jp/WebSearchService/V1/WebSearchResponse.xsd"
  totalResultsAvailable="56800000" totalResultsReturned="10"
  firstResultPosition="1">
  <Result>
    <Title>サーバサイド技術の学び舎 - WINGS</Title>
    <Summary>サーバサイド技術(JSP/サーブレット、ASP.NET、PHP、XML)に関する最新情報を提供 ... シリーズ別書籍リスト webWareダウンロード 「WINGS News」登録/解除 WINGSプロジェクトメンバ募集 ページを知人に紹介 ...</Summary>
    <Url>http://www.wings.msn.to/</Url>
    <ClickUrl>http://wrs.search.yahoo.co.jp/S=96857362/K=WINGS/v=2/ XP=yws/SID=w/l=WS1/R=1/H=0/IPC=jp/SHE=0/;_ylt=A8vY5mmWU3VEoj4Bc1o AAAAA/SIG=11csekj9s/EXP=1148626198/*-http%3A//www.wings.msn.to/</ClickUrl>
    <ModificationDate>1147964400</ModificationDate>
    <MimeType>text/html</MimeType>
    <Cache>
      <Url>http://wrs.search.yahoo.co.jp/S=96857362/ K=WINGS/v=2/XP=yws/SID=w/l=WS5/R=1/;_ylt=A8vY5mmWU3VEoj4BdFoAAAAA/ SIG=150hbkfgn/EXP=1148626198/*-http%3A//cache.yahoofs.jp/search/ cache?ei=UTF-8&eo=UTF-8&ac=0 &n=10&b=1&va=WINGS&vm=r&u=www.wings.msn.to/&w=wings&d=S zk7hkaqM0py&icp=1&.intl=jp</Url>
      <Size>23471</Size>
    </Cache>
  </Result>
  ……中略……
</ResultSet>
XMLデータとして取得した検索キーワードにマッチした結果

 以上、「Yahoo! 検索ウェブサービス」の基本的な挙動が確認できたら、いよいよ本題だ。Webフォームを介して「Yahoo! 検索ウェブサービス」にアクセスし、その結果を見やすい個条書きリストの形式に整形する手順について見ていくことにしよう。

1. Webフォームをデザインする

 フォーム・デザイナ上には、以下の画面の要領でサーバ・コントロールを配置する。また、それぞれのコントロールに対しては、表の内容でプロパティ値を設定しておこう。

Webフォーム(C#:yahoo_cs.aspx/VB:yahoo_vb.aspx)のフォーム・レイアウト
フォーム・デザイナ上に、サーバ・コントロールを配置して、それぞれのプロパティを表のように設定する。
コントロール プロパティ名 設定値
TextBox (ID) txtKeyword
Text WINGS
Button (ID) btnSearch
Text 検索
BulletedList (ID) list
DisplayMode HyperLink

 BulletedListコントロールは、ASP.NET 2.0から追加されたサーバ・コントロールの1つで、与えられたデータソースの内容を個条書きリストとして出力するためのコントロールだ。

 BulletedListコントロールの出力方式は、DisplayModeプロパティで変更できる。DisplayModeプロパティで設定可能な値は、以下のとおりだ。

設定値 概要
Text テキスト
HyperLink ハイパーリンク
LinkButton リンクボタン
DisplayModeプロパティで利用可能な設定値

2. データソースの内容を定義する

 次に、BulletedListコントロールに関連付けるデータソースを定義する。データソースを定義するには、BulletedListコントロール右上から[BulletedListタスク]メニュー−[データソースの選択]を選択することで行える。

[データソース構成ウィザード]ダイアログ(1)
BulletedListコントロール右上から[BulletedListタスク]メニュー−[データソースの選択]を選択することで、このウィザードが表示される。ここではデータソースの選択を行っている。

 上図のような[データソース構成ウィザード]ダイアログが起動するので、[データソースの選択]から[<新しいデータソース...>]を選択すればよい。あとは、以下の図の要領でデータソースの取得に必要な情報を設定するだけだ。

[データソース構成ウィザード]ダイアログ(2)
次に表示される[データソースの種類を選びます]ページでは、データソースとして「XML ファイル」を選択し、データソースIDとして「xml」を入力する。

[データソース構成ウィザード]ダイアログ(3)
[データソースの構成]ダイアログでは、[データ ファイル]に「Yahoo! 検索ウェブサービス」のURLを入力する。[変換ファイル]には本稿で用意する.xslファイルを指定する(詳細後述)。

 本稿では「Yahoo! ウェブ検索サービス」から検索結果をXMLデータとして取得するので、データソースの種類として「XMLファイル」を選択しておこう。XMLファイルを選択した場合、XMLデータの取得先として「http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?appid=wings-project&query=WINGS&results=10」を、取得したXMLデータを変換するためのXSLTスタイルシートとして「~/App_Data/YahooTransfer.xsl」を、それぞれ指定する。

 YahooTransfer.xslの内容は、以下のとおり。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:yahoo="urn:yahoo:jp:srch" version="1.0">
  <xsl:template match="/yahoo:ResultSet">
    <ResultSet>
      <xsl:for-each select="yahoo:Result">
        <Result>
          <xsl:attribute name="Title">
            <xsl:value-of select="yahoo:Title" />
          </xsl:attribute>
          <xsl:attribute name="Url">
            <xsl:value-of select="yahoo:Url" />
          </xsl:attribute>
        </Result>
      </xsl:for-each>
    </ResultSet>
  </xsl:template>
</xsl:stylesheet>
Yahoo! ウェブ検索サービスから取得した検索結果を変換するためのXSLTスタイルシート(YahooTransfer.xsl)

 YahooTransfer.xslは、あらかじめ仮想ディレクトリ直下の「App_Data」フォルダに配置しておく必要がある。App_Dataフォルダは、ASP.NET 2.0から追加された予約フォルダ(アプリケーション・フォルダ)の1つで、データベース・ファイル(「.mdf」「.mdb」などの拡張子を持つファイル)やXMLデータを配置する。

 もちろん、任意のフォルダに配置することも可能ではあるが、App_DataフォルダにはエンドユーザーがHTTP経由ではアクセスできないという特徴がある。XSLTスタイルシートやそのほか、アプリケーション内部でのみ使用するようなリソースは、App_Dataフォルダに配置しておくことが望ましい。

 本稿ではXSLTに関する詳細は割愛するが、興味のある方は「サンプルで覚えるXSLTプログラミング」などの情報を参考にするとよい。

 このXSLTスタイルシートでは、「Yahoo! ウェブ検索サービス」から取得した結果を、以下のようなXMLデータに変換している。<Result>要素が情報1件を表し、Title属性がサイト名、Url属性がリンク先URLを表しているものとする(検索結果からそのほかの情報を取り出したい場合には、YahooTransfer.xslの太字部分に適宜、<xsl:attribute>要素を追記すればよい)。

<ResultSet xmlns:yahoo="urn:yahoo:jp:srch">
  <Result Title="サーバサイド技術の学び舎 - WINGS"
     Url="http://www.wings.msn.to/">
  </Result>
  <Result Title="Wings Corporation" Url="http://www.wings.co.jp/">
  </Result>
  ……中略……
</ResultSet>
Yahoo! ウェブ検索サービスをYahooTransfer.xslで変換した結果(例)

 以上を理解したら、[OK]ボタンをクリックする。最初の[データソース構成ウィザード]ダイアログに戻るので、[BulletedListで表示するデータフィールドの選択][BulletedListの値のデータフィールドの選択]に、それぞれ「Title」「Url」と指定する。これによって、変換後XMLにおける<Result>要素のTitle属性が個条書きリストのテキストとして、Url属性が個条書きリストのリンク先URLとして、それぞれ適用されるというわけだ。

 これで、画面の外観にかかわる設定は完了だ。ここで参考までにVisual Studio 2005によって自動生成されたコードを引用しておく。

<form id="form1" runat="server">
<div>
  <%--検索キーワード入力用のフォーム--%>
  <asp:TextBox ID="txtKeyword" runat="server">WINGS</asp:TextBox>
  <asp:Button ID="btnSearch" runat="server"
    OnClick="btnSearch_Click" Text="検索" />
  <hr />
</div>
<%--検索結果を表示するための個条書きリスト。
    デフォルトで検索キーワード「WINGS」による結果を表示--%>
<asp:BulletedList ID="list" runat="server" DataSourceID="xml"
  DataTextField="Title" DataValueField="Url" DisplayMode="HyperLink">
</asp:BulletedList>
<asp:XmlDataSource ID="xml" runat="server"
  TransformFile="~/App_Data/YahooTransfer.xsl"
  DataFile="http://api.search.yahoo.co.jp/WebSearchService/V1/ webSearch?appid=wings-project&query=WINGS&results=10"></asp:XmlDataSource>
</form>
Webフォーム(yahoo_cs.aspx/yahoo_vb.aspx)のソース・コード(抜粋)
BulletedListコントロールにかかわる設定を行った後、Visual Studio 2005によって自動生成されたコードを引用したもの。なお、<%--〜--%>は筆者によるコメント。

3. [検索]ボタン・クリック時の挙動を定義する

 最後に[検索]ボタンがクリックされたタイミングで、検索キーワードをBulletedListコントロール(正確には、データソース・コントロールであるXmlDataSourceコントロール)に引き渡すコードを記述しておこう。

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class yahoo_cs : System.Web.UI.Page
{
  protected void btnSearch_Click(object sender, EventArgs e)
  {
    xml.DataFile =
      "http://api.search.yahoo.co.jp/WebSearchService/V1/ webSearch?appid=wings-project&query="
      + Server.UrlEncode(txtKeyword.Text) + "&results=10";
  }
}
Partial Class yahoo_vb
  Inherits System.Web.UI.Page
  Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
    xml.DataFile = _
      "http://api.search.yahoo.co.jp/WebSearchService/V1/ webSearch?appid=wings-project&query=" _
      & Server.UrlEncode(txtKeyword.Text) & "&results=10"
  End Sub
End Class
[検索]ボタンをクリックした場合の動作(上:yahoo_cs.aspx.cs、下:yahoo_vb.aspx.vb)

 これによって、XMLDataSourceコントロールのDataFileプロパティに対して、テキストボックスからの入力値に基づいて動的に生成されたURLが引き渡されるというわけだ。テキストボックスからの入力値を引き渡す場合には、Server.UrlEncodeメソッドであらかじめURLエンコード処理を施しておく必要がある。

 以上を理解したら、さっそくここまでに作成したサンプル・プログラムを実行してみよう。

サンプル・アプリケーションの実行結果
テキストボックスに入力された検索キーワードに基づいて、個条書きリストが表示される。

 これによって、XMLDataSourceコントロールのDataFileプロパティに対して、テキストボックスからの入力値に基づいて動的に生成されたURLが引き渡されるというわけだ。テキストボックスからの入力値を引き渡す場合には、Server.UrlEncodeメソッドであらかじめURLエンコード処理を施しておく必要がある。

 以上を理解したら、さっそくここまでに作成したサンプル・プログラムを実行してみよう。

 この画面のように、テキストボックスから入力した値に対応する検索結果がリスト表示されれば成功だ。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:XmlDataSourceコントロール
使用キーワード:XmlDataSourceコントロール

この記事と関連性の高い別の.NET TIPS
[ASP.NET]任意のXMLファイルからサイト・メニューを作成するには?
[ASP.NET AJAX]PagingBulletedListコントロールでページング可能な個条書きリストを定義するには?
VS.NETで効率よくキーワード検索を行うには?
VB開発設定の標準ツールバーに検索コンボボックスを表示させるには?
[ASP.NET AJAX]DynamicPopulateコントロールでXML Webサービスを非同期に呼び出すには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間