×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。


Googleを追いかけろ!

.

チュートリアル 上級者 3-5: XML Document の構成要素の分析

  • Google Apps Script を利用してXMLドキュメントをパースし、回収したデータを操作します。 ここでは Oracle of Bacon のウェブサイトのデータを利用します。異なる俳優たちがそれぞれの出演した映画フィルムを互いに関連付けています。 XMLサービスのクラスやメソッドの使い方が分るでしょう。

    JavaScriptXML の知識によりますが、10分から20分で終わります。 HTML,XML,JavaScript 等の知識があれば容易でしょう。 XLM をパースするために XML コンテンツの構造を知っておいてください。もしXML データがフラットファイルならばエレメント名があるかどうか調べる必要があります。 XMLファイルにブラウザからアクセスする場合 ページソースの表示 機能を使います。また Google Chrome ならコンテキストメニューから Inspect Element メニューを利用できます。

    §1 スプレッドシートとスクリプトの用意

    §2 スクリプトの実行

    §3 スクリプトの動き

    §4 Kevin Bacon Script

    チュートリアル 上級者/目次 参照ページ(Goolge)


WWW を検索 Googleを追いかけろ! を検索


§1 スプレッドシートとスクリプトの用意

  1. Google Docs で新規スプレッドシートを開きます。
  2. Kevin Bacon 名で保存します。
  3. ツールメニューから【挿入】を選びます。
  4. Script Gallery へ行きダイアログボックスに Kevin Bacon と入力してSix Degrees of Kevin Bacon Calculator へ移動します。
  5. クリックしてインストールして閉じてください。

§2 スクリプトの実行

  1. スクリプトの実行のためにセルのどこかを選択して、=kb("actor_name1","actor_name2")=kb("Ellen DeGeneres","Kevin Bacon")のようにしてEnterします。 名前の入れ替わった下の2つの検索結果が表示されます。

    Ellen DeGeneres was in Doctor Dolittle (1998) with Pruitt Taylor Vince who was in Trapped (2002) with Kevin Bacon
    または
    Kevin Bacon was in Murder in the First (1995) with Stephen Tobolowsky who was in Trevor (1994) with Ellen DeGeneres

  2. 引数 actor_name2 の部分をブランクにすると Kevin Bacon が初期値で表示されます。 Oracle of Bacon 名と入力すればひとつふたつヒットするかもしれませんが、おそらく Cannot find actor: actor_name のエラーメッセージが表示されると思います。
  3. このスクリプトは Oracle of Bacon サイトのデータから2つ以上の結果は選び取れないのでエラーメッセージが出るのです。

§3 練習 : スクリプトの動き

Oracle of Bacon ではXML のフォーマットでファイルを保存しています。XLM または eXtensible マークアップ言語 はそれぞれのデータタイプをエレメント(要素)を使ってテキストフォームで記述されたデータです。例えば絵画についての XML データベースならば 画家の名前の他に生年月日や命日、絵画のタイトル、製作年などの要素があるはずです。

Oracle of Bacon XML データベースは俳優や出演した映画名などの情報を持っています。Oracle of Bacon Script は俳優名での入力を受け入れ その俳優の出演した映画名を共演者名とともに引き出して1番目の俳優と2番目の俳優を結び付けます。

コードの重要な部分について見てみます。

最初の関数でユーザーがスプレッドシートにインプットした俳優名を保持してOracle of Baconからデータを回収してきます。 コードを調べるためにKevin Bacon spreadsheet へ行ってはじめのセッションを維持してください。【Script editor】を開いて見て見ましょう。 from to という引数名をもつコードがあります。

function kb(from, to) {
  if (!to) {
    to = "Kevin Bacon";
  }
次のブロックで Oracle of Bacon で回収したデータを定義付ています。from toという引数は関係を調べようとして入力された二人の俳優名を含みます。 payloadHTTP POST メソッドで受け取ったOracle of Baconサイトで稼動している CGI への検索言語 を持っています。
 var parameters = {
     method : "post",
     payload :
    "a=" + encodeURIComponent(from) +
     "&b=" + encodeURIComponent(to) +
     "&u=1" +  // movies only. Use "3" to include TV
     "&p=" + encodeURIComponent('google-apps')
   };
メソッドの引数は使用されているHTTP リクエストメソッドを指定しており、この場合は HTTP POSTです。 payload 引数は POST リクエスト本体を含みます。この場合はOracle of Bacon サイトへのリクエストを指定するのに必要な4つのname値の組があります。 それらは次のような意味になります。
  • "a=" + encodeURIComponent(from) ・・ 一番目の俳優をリクエストします。
  • "&b=" + encodeURIComponent(to) ・・ 二番目の配収をリクエストします。
  • "&u=1" ・・ 二人の俳優が共に出演している映画をリクエストしています。もし"&u=3"が使われればそれは映画とTVでの二人の共演フィルムということです。
  • "&p=" + encodeURIComponent('google-apps') ・・ Google AppsからのリクエストであることをOracle of Bacon に伝えています。
次の行で Oracle of Bacon のXMLデータを拾って、変数textへ入れます。parameters引数は前のコードブロックでOracle of Baconに対して定義づけられたparametersは無視します。
var text = UrlFetchApp.fetch("http://oracleofbacon.org/cgi-bin/xml",
                                parameters).getContentText();
これが Oracle of Bacon から返されたデータの一部です。

 
   Arnold Schwarzenegger
   Total Recall (1990)
   Anne Lockhart (I)
   The Last Song (2010)
   Miley Cyrus
 
XMLデータ タグの使われている俳優と映画を書き出しています。

kb関数はテスト関数であるtestBacon関数によって継承されます。

最後の parse関数です。ここで XMLデータ がパースされて、表示された XMLデータ が抽出されます。 スクリプトは Xml メソッドparseを使った変数text中のデータをパースします。parse メソッドは文字列によって提供されるXMLの内容を必要とし、ここでは doc と呼ばれるXMLドキュメントを返します。

function parse(txt) {
var doc = Xml.parse(txt, true);
XMLドキュメントである doc から3個のXMLエレメント(要素)オブジェクトを取り出すのが次のコードです。順番に html,head,body セクションです。
var html = doc.html;       
var head = doc.html.head;       
var body = doc.html.body;
Oracle of Bacon では htmlタグhead タグだけの使用なので doc.html.body は失敗します。 body タグはありません。 doc.html.head タグの呼び出しでは movieタグactorタグ を含む XML-tagged データを返します。それぞれ典型的なものです。 次のコードでは doc から映画名や俳優名を抽出する明示的なメソッドを使っています。そして moovieactors という配列にします。
var movies = doc.html.head.getElements("movie");
var actors = doc.html.head.getElements("actor");
最後に次のコードで二人の俳優の関連を検索して表示します。
var movieIndex = 0;
  var r = '';
  var firstPerson = true;
  for (var i in actors) {
    r = r + actors[i].getText();
    if (movies[movieIndex]) {
      r = r + (firstPerson ? "" : " who") + " was in " +
         movies[movieIndex].getText() + " with ";
    }
    movieIndex++;
    firstPerson = false;
  }
  
  return r;
  }

§4 Kevin Bacon Script

Kevin Bacon Scriptの完全版です。
// This script makes use of the Oracle of Bacon,
// a very cool site at http://oracleofbacon.org.
// Takes two arguments: names of actors.  The second 
// is optional, and defaults to "Kevin Bacon" if unspecified.
//
// Example usage in a spreadsheet:
//      =kb("Miley Cyrus", "Arnold Schwarzenegger")
//

function kb(from, to) {
  if (!to) {
    to = "Kevin Bacon";
  }
  var parameters = {
    method : "post",
    payload :
    "a=" + encodeURIComponent(from) +
    "&b=" + encodeURIComponent(to) +
    "&u=1" +  // movies only. Use "3" to include TV
    "&p=" + encodeURIComponent('google-apps')
  };
  
  var text = UrlFetchApp.fetch("http://oracleofbacon.org/cgi-bin/xml",
                               parameters).getContentText();
  return parse(text);
}
  
function testBacon() {
  var result = kb("Miley Cyrus", "arnold schwarzenegger");
  Logger.log(result);
}

function parse(txt) {
  var doc = Xml.parse(txt, true);
  var attr = doc.spellcheck;
  if (attr) {
    return "Cannot find actor: " + attr.name;
  }
 
  var actors = doc.html.head.getElements("actor");      
  var movies = doc.html.head.getElements("movie");
  
  if (!actors || actors.length ==0) {
    return "no match found";
  }
  
  var movieIndex = 0;
  var r = '';
  var firstPerson = true;
  for (var i in actors) {
    r = r + actors[i].getText();
    if (movies[movieIndex]) {
      r = r + (firstPerson ? "" : " who") + " was in " +
        movies[movieIndex].getText() + " with ";
    }
    movieIndex++;
    firstPerson = false;
  }
  
  return r;
}




    * チュートリアル 上級者/目次
    1. シンプルなメール統合 - フォームやスプレッドシートと特定されたメールの配信を結びつける
    2. 経費報告書の承認 -フォームやスプレッドシートを扱う上での簡単なワークフローアプリケーションの作成
    3. Google App Engine services - Google App Engineで構築されたウェブサービスと連携する
    4. ソープ IP Service に関して - サードパーティーのIP Geocoding service を呼び出すための Soap Service
    5. XML Document の構成要素の分析 - ウェブ上のソースをXML dataとしてパースする
    6. Help Desk Workflow - メール,フォーム,スプレッドシート,カレンダー,サイト等のhelp desk workflow 自動化
    7. Twitter用承認マネージャ - OAuth, MailApp, ScriptProperties, UiAppを利用したTwitter用承認マネージャ
    8. 予約アプリケーションの作成 - Ui Services in Apps Scriptを活用してGoogle Sitesに予約アプリケーションを作成
    --チュートリアル 上級者 3-5. XML Document の構成要素の分析 : end -- 2011/10/30