IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  XML | Open source  >

PHP を使って Google ノートブックのデータを処理、統合する

Google ノートブックの REST API を使って PHP ベースのクライアント・アプリケーションを構築する

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 中級

Vikram Vaswani, Founder, Melonfire

2008年 5月 20日

Google ノートブックは、ユーザーがオンライン・ジャーナルにメモと Web クリッピングを保存し、共有できる無料のサービスです。このサービスが提供する REST ベースの API を利用することで、開発者はこのサービス向けにカスタマイズした PHP アプリケーションを SimpleXML を使って構築できるようになります。この記事では、ノートブックやノートブックのコンテンツを PHP を使って読み取る例を用いて、この API の使い方を説明します。

はじめに

熱心な Web サーファーなら、きっと Google ノートブックというサービスのことはもうご存知でしょう (もしかすると使ったこともあるのではないでしょうか)。Google ノートブックでは、ユーザーがオンライン・ジャーナルに Web ブラウザーでアクセスして、ToDo リストの項目、Web クリッピング、テキスト・スクラップ、そして個人的なメモを保存することができます。さらに複数のユーザーで 1 つのノートブックを共有したり、そのノートブックをWeb ページとして公開することも可能なため、共同作業にも役立ちます。

よく使われる頭字語
  • API: application programming interface
  • HTML: HyperText Markup Language
  • HTTP: Hypertext Transfer Protocol
  • PHP: PHP Hypertext Preprocessor
  • REST: Representational state transfer
  • RSS: Really Simple Syndication
  • URL: Uniform Resource Locator
  • XML: Extensible Markup Language

開発者の視点から見ると、Google ノートブックで特に興味深いのはその Data API です。開発者はこの REST ベースの API を使用して、公開ノートブックのコンテンツを読み取り、読み取ったデータを自分の XML 対応クライアント・アプリケーションに統合することができます。API が返すデータは XML 形式なので、Perl や PHP、あるいは Java™ といったよく使われる言語で簡単に構文解析を行うことができます。例えば PHP を使用するとすれば、SimpleXML などのツールがデータ・リクエストに対する REST レスポンスを構文解析するために必要なすべてのことを行ってくれます。

この記事ではこの API の機能を実証するため、SimpleXML を使って Google ノートブックのコンテンツを PHP アプリケーションに統合する方法を説明します。そして、ユーザーの公開ノートブックのリストを取得する例、ノートブックからすべてのメモを取得する例、そしてノートブックのコンテンツをセクションごとに取得する例を紹介します。




上に戻る


Data API について

PHP コードの詳細を検討する前に、Google ノートブックの Data API について少し説明しておきます。REST をベースとしたサービスの例に漏れず、この API も HTTP 上で動作します。1 つ以上の入力パラメーターが含まれる HTTP クエリー・ストリングをデコードし、XML 対応のクライアントでの構文解析に適した Atom または RSS 形式のレスポンスを返します。

現在、Google ノートブックの Data API は読み取り専用となっています。この API にはユーザーの 1 つまたは複数の公開ノートブックに含まれるコンテンツを取得するメソッドが含まれますが、この API を使ってノートブックのデータを追加または変更したり、専用ノートブックのコンテンツを取得したりすることはできません。そうは言っても、この API にはかなり完成度の高い有益なアプリケーションを構築するための情報が十二分に含まれています。例えばリスト 1 を見てください。これは、ユーザーの公開ノートブックのリストを取得するための API 呼び出しの結果です。


リスト 1. Google ノートブックの Data API からの REST レスポンス
                
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
  <id>http://www.google.com/notebook/feeds/00000000000000</id>
  <updated>2008-05-12T11:43:32.830Z</updated>
  <title type='text'>Anonymous's Notebooks</title>
  <link rel='alternate' type='text/html' 
  href='http://www.google.com/notebook/user/00000000000000' 
  title='Anonymous's Notebooks'/>
  <link rel='http://schemas.google.com/g/2005#feed' 
  type='application/atom+xml' 
  href='http://www.google.com/notebook/feeds/00000000000000'/>
  <link rel='self' type='application/atom+xml' 
  href='http://www.google.com/notebook/feeds/00000000000000'/>
  <author>
    <name>Anonymous</name>
  </author>
  <generator version='1.0' 
  uri='http://www.google.com/notebook'>Google Notebook</generator>
  <openSearch:totalResults>2</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>10</openSearch:itemsPerPage>
  <entry>
    <id>http://www.google.com/notebook/feeds/00000000000000/AAAAAAAAAA</id>
    <published>2008-05-11T18:05:04.234Z</published>
    <updated>2008-05-12T11:43:32.830Z</updated>
    <title type='text'>My First Notebook</title>
    <summary type='text'>My First Notebook</summary>
    <content type='application/atom+xml' 
    src='http://www.google.com/notebook/feeds/00000000000000/notebooks/AAAAAAAAAA'/>
    <link rel='alternate' type='text/html' 
    href='http://www.google.com/notebook/public/00000000000000/AAAAAAAAAA' 
    title='My First notebook'/>
    <link rel='self' type='application/atom+xml' 
    href='http://www.google.com/notebook/feeds/00000000000000/AAAAAAAAAA'/>
    <author>
      <name>Anonymous</name>
    </author>
  </entry>
  <entry>
    <id>http://www.google.com/notebook/feeds/00000000000000
    /BDQ7QIgoQp6TK350j</id>
    <published>2008-05-12T07:05:17.607Z</published>
    <updated>2008-05-12T11:42:46.103Z</updated>
    <title type='text'>My Second Notebook</title>
    <summary type='text'>My Second Notebook</summary>
    <content type='application/atom+xml' 
    src='http://www.google.com/notebook/feeds/00000000000000/notebooks/BDQ7QIgoQp6TK350j'
    /><link rel='alternate' type='text/html' 
    href='http://www.google.com/notebook/public/00000000000000/BDQ7QIgoQp6TK350j' 
    title='My Second Notebook'/>
    <link rel='self' type='application/atom+xml' 
    href='http://www.google.com/notebook/feeds/00000000000000/BDQ7QIgoQp6TK350j'/>
    <author>
      <name>Anonymous</name>
    </author>
  </entry>
</feed>
        

この出力にざっと目を通して、主な要素を把握してください。

  • Google ノートブックの Data API は REST リクエストに対し、要求されたデータが含まれるフィードで応答します。XML レスポンスでは、このフィードはルート要素としての <feed> 要素で表されます。<feed> 要素のなかには、ノートブック・リストへの URL が XML 形式と HTML 形式の両方で含まれる <link> 要素、そして検索の要約統計情報が含まれる <openSearch:> 要素があります。
  • 最も外側の <feed> 要素の内側には各ノートブックを表す <entry> 要素が 1 つ以上含まれます。各 <entry> に含まれるのは、ノートブックのタイトル、説明、公開日、最終更新日、作成者などの詳細情報です。これらの情報は、それぞれ <title>、<summary>、<published>、<updated>、<author> 要素で表されます。

同じようにして、各ノートブックの内容についての詳細が含まれたフィードを取得することもできます。フォーマットは上記と同様です (ただし、要素の数は多くなります)。その一例は、リスト 3 に記載してあります。




上に戻る


ノートブックのリストを作成する方法

ここからは、PHP を使用して Google ノートブックの Data API フィードを処理する具体的な例に話を進めます。リスト 2 では、リスト 1 のフィードを取得し、SimpleXML を使って抽出した関連するデータのフラグメントを Web ページのフォーマットになるように設定しています。


リスト 2. ユーザーの公開ノートブックのリスト
                                
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing a user's public notebooks</title>
    <style>
    body {
      font-family: Verdana;      
    }
    li {
      border-bottom: solid black 1px;      
      margin: 10px; 
      padding: 2px; 
      width: auto;
      padding-bottom: 20px;
    }
    h2 {
      color: red; 
      text-decoration: none;  
    }
    span.attr {
      font-weight: bolder;  
    }
    </style>    
  </head>
  <body>
    <?php
    // set user ID
    // replace with actual value 
    $userid = '00000000000000';
    
    // build feed URL
    $feedURL = 'http://www.google.com/notebook/feeds/' . $userid;
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get number of notebooks
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults; 
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <?php echo $total; ?> item(s) found.
    <p/>
    <ol>
    <?php    
    // iterate over entries in category
    // print each entry's details
    foreach ($sxml->entry as $entry) {
      $title = $entry->title;
      $summary = $entry->summary;
      $published = $entry->published;
      $updated = $entry->updated;
      
      echo "<li>\n";
      echo "<h2>$title</h2>\n";
      echo "<span class=\"attr\">Summary:</span> $summary <br/>\n";
      echo "<span class=\"attr\">Last update on:</span> " . 
       date('d M Y h:i:s', strtotime($updated));
      echo "</li>\n";
    }
    ?>
    </ol>
  </body>
</html>  
        

図 1 は、上記のスクリプトによる出力例です。


図 1. ユーザーの公開ノートブックを表示する Web ページ

リスト 2 ではまず、simplexml_load_file() 関数を使ってフィード URL にリクエストを送信し、レスポンスを SimpleXML オブジェクトに変換します。続いてレスポンスに含まれる <entry> 要素の繰り返し処理により、各要素を foreach() ループで処理して図 1 に表示された情報を取得します。各 <entry> の子ノードは、 SimpleXML オブジェクトのプロパティーとして表されます。例えば、<title> ノードの場合は $sxml->title、<summary> ノードの場合は $sxml->summary という表現になります。

ここでフィード URL について一言説明させてもらうと、フィード URL はユーザー固有の ID を標準のフィード URL に追加することによって生成されます。つまり、http://www.google.com/notebook/feeds/USERID という形式です。ID は手動で取得しなければなりません。ID を取得するには、対応する Google ノートブックのページにアクセスし、手動でユーザー ID を PHP スクリプトにコピーします。




上に戻る


ノートブックのコンテンツを表示する方法

これで、ユーザーの公開ノートブックのリストは作成できるようになりましたが、ノートブックのコンテンツはどのように表示すればいいのでしょう。

これも特に難しい作業ではありません。必要なことは、ノートブック ID を取得し (前のセクションで説明したユーザー ID を取得するプロセスと同様の手動のプロセス)、フィード URL を http://www.google.com/notebook/feeds/USERID/notebooks/NOTEBOOKID という形式で生成して、この URL に REST リクエストを送信するだけです。出力はリスト3 のようになります。


リスト 3. Google ノートブックの Data API からの REST レスポンス
                
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
  <id>http://www.google.com/notebook/feeds/00000000/notebooks/AAAAAAAAA</id>
  <updated>2008-05-12T07:47:31.118Z</updated>
  <title type='text'>My first notebook</title>
  <link rel='alternate' type='text/html' 
  href='http://www.google.com/notebook/public/00000000/AAAAAAAAA' 
  title='My first notebook'/>
  <link rel='http://schemas.google.com/g/2005#feed' 
  type='application/atom+xml' 
  href='http://www.google.com/notebook/feeds/00000000/notebooks/AAAAAAAAA'/>
  <link rel='self' type='application/atom+xml' 
  href='http://www.google.com/notebook/feeds/00000000/notebooks/AAAAAAAAA'/>
  <author>
    <name>Anonymous</name>
  </author>
  <generator version='1.0' uri='http://www.google.com/notebook'>
  Google Notebook</generator>
  <openSearch:totalResults>5</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>10</openSearch:itemsPerPage>
  <entry>
    <id>http://www.google.com/notebook/feeds/00000000/notebooks
    /AAAAAAAAA/NDQ9jIgoQ6qH53p0j</id>
    <published>2008-05-12T06:43:10.186Z</published>
    <updated>2008-05-12T06:43:46.415Z</updated>
    <category scheme='http://schemas.google.com/notebook/gdata/2007/section' 
    term='SDQqRIwoQm5zj4J0j' label='My Books'/>
    <title type='text'>How to do Everything with PHP and MySQL 
    A beginner's guide to using PHP and M...</title>
    <content type='html'><a href="http://www.everythingphpmysql.com/">
    How to do Everything with PHP and MySQL</a><br>A beginner&#39;s 
    guide to using PHP and MySQL together <br></content>
    <link rel='alternate' type='text/html' 
    href='http://www.google.com/notebook/public/00000000/AAAAAAAAA#NDQ9jIgoQ6qH53p0j' 
    title='How to do Everything with PHP and MySQL 
    A beginner's guide to using PHP and M...'/>
    <link rel='self' type='application/atom+xml' 
    href='http://www.google.com/notebook/feeds/00000000/notebooks
    /AAAAAAAAA/NDQ9jIgoQ6qH53p0j'/>
    <author>
      <name>Anonymous</name>
    </author>
  </entry>
  <entry>
    <id>http://www.google.com/notebook/feeds/00000000/notebooks/AAAAAAAAA/
    NDSGpIgoQ6oX13p0j</id>
    <published>2008-05-12T06:42:01.066Z</published>
    <updated>2008-05-12T06:42:46.926Z</updated>
    <category scheme='http://schemas.google.com/notebook/gdata/2007/section' 
    term='SDQqRIwoQm5zj4J0j' label='My Books'/>
    <title type='text'>MySQL: The Complete Reference An authoritative 
    reference to MySQL</title>
    <content type='html'><a href="http://www.mysql-tcr.com/">
    MySQL: The Complete Reference</a><br>An authoritative reference to 
    MySQL<br></content>
    <link rel='alternate' type='text/html' 
    href='http://www.google.com/notebook/public/00000000/AAAAAAAAA#NDSGpIgoQ6oX13p0j' 
    title='MySQL: The Complete Reference An authoritative reference to MySQL'/>
    <link rel='self' type='application/atom+xml' 
    href='http://www.google.com/notebook/feeds/00000000/notebooks/
    AAAAAAAAA/NDSGpIgoQ6oX13p0j'/><author>
      <name>Anonymous</name>
    </author>
  </entry>
  ...
</feed>
      

上記は、リスト 1 に記載した出力とそれほど変わりません。レスポンスは <feed> ルート要素で始まり、その後に、ノートブックのコンテンツへの URL が XML 形式と HTML 形式の両方で含まれる <link> 要素、そしてノートブックに関する要約統計情報が含まれる <openSearch:> 要素が続きます。

最も外側の <feed> 要素の内側には、各メモを表す <entry> 要素が 1 つまたは複数あります。各 <entry> では、カテゴリー、タイトル、コンテンツ、公開日、最終更新日、作成者などの詳細情報がそれぞれ <category>、<title>、<content>、<published>、<updated>、<author> といった要素で表されます。このうち、メモの実際のコンテンツが含まれるのは <content> 要素です。type=html 属性は、コンテンツが HTML 形式で表されていることを示します (そのため、ブラウザーに直接レンダリングできます)。

リスト 4 の PHP コードは、この XML を処理して、Web ページとしてレンダリングします。


リスト 4. ノートブックのコンテンツの表示
                                
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing a user's notes</title>
    <style>
    li {
      border-bottom: solid black 1px;      
      margin: 10px; 
      padding: 2px; 
      width: auto;
      padding-bottom: 20px;
    }
    a {
      color: red; 
      text-decoration: none;  
    }
    </style>    
  </head>
  <body>
    <?php
    // set user ID and notebook ID    
    // replace these with actual values 
    $userid = '000000000000000000';
    $notebookid = 'AAAAAAAAAA';
    
    // build feed URL
    $feedURL = 'http://www.google.com/notebook/feeds/' . $userid . 
     '/notebooks/' . $notebookid;
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get number of notes
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults; 
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <?php echo $total; ?> note(s) found.
    <p/>
    <ol>
    <?php    
    // iterate over entries in notebook
    // print each entry's details
    foreach ($sxml->entry as $entry) {
      $entry->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
      $content = $entry->xpath("atom:content[@type='html']");      
      echo "<li>{$content[0]}</li>\n";
    }
    ?>
    </ol>
  </body>
</html>     
        

結果は図 2 のようになるはずです。


図 2. ユーザーの公開ノートブックのコンテンツを表示する Web ページ

リスト 4 では、フィード URL は指定されたユーザーとノートブック ID から動的に生成され、このフィード URL から返された XML が simplexml_load_file() メソッドによって処理され SimpleXML にされます。続いて foreach ループでさまざまな <entry> 要素が処理されて、各メモのコンテンツが取得、表示されます。ここで注目すべき点は、xpath() メソッドを使用して、type=html 属性が指定された <content> ノードだけが取得されるようにしていることです。




上に戻る


API 出力をカスタマイズする方法

以下のパラメーターを REST クエリーに追加することで、API 出力をカスタマイズすることができます。

  • start-index パラメーター。ノートブック・エントリーの開始オフセットを指定します。
  • max-results パラメーター。取得するノートブック・エントリーの数を指定します。
  • updated-minupdated-maxpublished-minpublished-max パラメーター。返されるエントリーの (更新日または公開日の) 日付の範囲を指定します。
  • orderby パラメーター。エントリーの並び替えの基準を指定します。

リスト 5は、リスト 4 の出力を 5 つのエントリーに制限し、ノートブックでの位置を基準にソートする例です。


リスト 5. API 出力のカスタマイズ
                                
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing a user's notes</title>
    <style>
    li {
      border-bottom: solid black 1px;      
      margin: 10px; 
      padding: 2px; 
      width: auto;
      padding-bottom: 20px;
    }
    a {
      color: red; 
      text-decoration: none;  
    }
    </style>    
  </head>
  <body>
    <?php
    // set user ID and notebook ID
    // replace these with actual values
    $userid = '02956669685298890120';
    $notebookid = 'BDT3iIgoQ6oKhyZ0j';
    
    // build feed URL
    // set max results and sort order
    $feedURL = 'http://www.google.com/notebook/feeds/' . $userid . 
     '/notebooks/' . $notebookid;
    $feedURL .= '?max-results=5&orderby=position';
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);    
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <p/>
    <ol>
    <?php    
    // iterate over entries in notebook
    // print each entry's details
    foreach ($sxml->entry as $entry) {
      $entry->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
      $content = $entry->xpath("atom:content[@type='html']");      
      echo "<li>{$content[0]}</li>\n";
    }
    ?>
    </ol>
  </body>
</html>     
        

リスト 5 は、フィード URL に max-results および orderby パラメーターを追加することで取得データのさらなるカスタマイズを行っている点を除けば、リスト 4 とまったく同じです。図 3 に出力結果を示します。


図 3. ユーザーの公開ノートブックのコンテンツをフィルタリングして表示する Web ページ




上に戻る


ノートブックのセクションを操作する方法

Google ノートブックでは、ユーザーがメモをセクション別に編成し、Data API を使ってそれぞれのセクションにアクセスできるようになっています。 リスト 3 の例を見るとわかるように、これらのセクションは各エントリー内の <category> 要素によって表されます。セクションを処理してクライアント・アプリケーションの詳細レベルをさらに追加するのは、それほど難しい作業ではありません。リスト 4 を拡張したリスト 6 を見れば、その方法がわかります。


リスト 6. ノートブックのセクションの表示
                                
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing a user's public notes by section</title>
    <style>
    li {
      border-bottom: solid black 1px;      
      margin: 10px; 
      padding: 2px; 
      width: auto;
      padding-bottom: 20px;
    }
    a {
      color: red; 
      text-decoration: none;  
    }
    </style>    
  </head>
  <body>
    <?php
    // set user ID and notebook ID
    // replace these with actual values
    $userid = '00000000000000';
    $notebookid = 'AAAAAAAAAAAA';
    
    // build feed URL
    $feedURL = 'http://www.google.com/notebook/feeds/' . $userid . 
     '/notebooks/' . $notebookid;
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get number of notes
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults; 

    // get section labels
    $sxml->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
    $categories = array_unique($sxml->xpath('//atom:category/@label'));    
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <?php echo $total; ?> note(s) found.
    <p/>
    <?php    
    // get entries
    // iterate over entries and check section labels
    // print each entry's details in the appropriate section
    $entries = $sxml->xpath("//atom:entry");    
    foreach ($categories as $c) {
      echo "<h2>{$c['label']}</h2>\n";
      echo "<ol>\n";              
      foreach ($entries as $entry) {
        $entry->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
        if(trim($entry->category['label']) == trim($c['label'])) {
          $content = $entry->xpath("atom:content[@type='html']");      
          echo "<li>{$content[0]}</li>\n";
        }
      }
      echo "</ol>\n";      
    }
    ?>
  </body>
</html>  
      

改良された出力は、図 4 のようになります。


図 4. ユーザーの公開ノートブックのセクションを表示する Web ページ

セクションを追加したことによって、リスト 6リスト 4 に比べると少し複雑になっています。このスクリプトはまず、REST リクエストを生成してフィード URL に送信し、レスポンスとして返された XML を SimpleXML オブジェクトに変換します。次に、xpath() メソッドを使用してすべての <category> 要素を取得し、それぞれの label 属性を読み取って固有のラベル (セクション名) が含まれる配列を生成します。続いてネストされた foreach() ループがエントリーを繰り返し処理し、エントリーをセクションに割り当てて Web ページとして表示します。

ただし、上記のようにするのがこの特定の目的を達成する唯一の手段ではありません。Google ノートブックの Data API では、開発者がノートブックのエントリーを特定のカテゴリー (セクション) に制限することもできます。その方法は、カテゴリー名をノートブック・フィードの URL に追加することです (例えば、http://www.google.com/notebook/feeds/USERID/notebooks/NOTEBOOKID/-/Section1/)。この事実を利用すれば、ノートブック・エントリーのカテゴリー別ビューを作成する他の方法を開発することができます。リスト 7 は、その一例です。


リスト 7. ノートブックのセクションの表示
                                
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing a user's public notes by section</title>
    <style>
    li {
      border-bottom: solid black 1px;      
      margin: 10px; 
      padding: 2px; 
      width: auto;
      padding-bottom: 20px;
    }
    a {
      color: red; 
      text-decoration: none;  
    }
    </style>        
  </head>
  <body>
    <?php
    // set user ID and notebook ID
    // replace these with actual values
    $userid = '00000000000000';
    $notebookid = 'AAAAAAAAAAAAAAA';
    
    // build feed URL
    $feedURL = 'http://www.google.com/notebook/feeds/' . $userid . 
     '/notebooks/' . $notebookid;
    
    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);
    
    // get number of notes
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults; 

    // get section labels
    $sxml->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
    $categories = array_unique($sxml->xpath('//atom:category/@label'));    
    ?>
    <h1><?php echo $sxml->title; ?></h1>
    <?php echo $total; ?> note(s) found.
    <p/>
    <?php    
    // iterate over categories
    foreach ($categories as $c) {
      echo "<h2>{$c['label']}</h2>\n";
      echo "<ol>\n";              
      // get feed of entries for each category
      $categoryfeedURL = $feedURL . '/-/' . urlencode($c['label']);
      $sxml2 = simplexml_load_file($categoryfeedURL);
      // iterate over entries in category
      // print each entry's details
      foreach ($sxml2->entry as $entry) {
        $entry->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
        $content = $entry->xpath("atom:content[@type='html']");      
        echo "<li>{$content[0]}</li>\n";
      }
      echo "</ol>\n";      
    }
    ?>
  </body>
</html>     
      

リスト7 では異なる方法を取っています。このスクリプトでまず初めに行っているのは、ノートブック・フィードを処理し、リスト 6 と同じ方法でフィードからカテゴリー名を切り分けることです。そして検出されたカテゴリーごとに、追加のカテゴリー・パラメーターを設定した新しい REST リクエストを生成します。このパラメーターにより、出力は該当するカテゴリーに一致するエントリーだけに制限されます。このサブリクエストの結果をさらに SimpleXML で処理してから表示すると、図4 に記載した出力と同じ出力が生成されることになります。

この記事で説明した例から明らかなように、Google ノートブックの Data API は開発者が公開ノートブックのコンテンツを Web アプリケーションに統合するには便利で、完成度の高い柔軟な手段となります。この API はマッシュアップを作成するときだけでなく、単に Google ノートブックへのカスタマイズしたインターフェースを作成するにも最適です。ぜひ、実際に使ってみてください。



参考文献

学ぶために

製品や技術を入手するために
  • IBM 製品評価用トライアル・ソフトウェア: developerWorks から直接ダウンロードできるトライアル・ソフトウェアで、次のプロジェクトを構築してください。DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® によるアプリケーション開発ツールおよびミドルウェア製品のトライアル版が揃っています。


議論するために


著者について

Vikram Vaswani は、オープン・ソースのツールと技術を専門とするコンサルティング・サービス会社、Melonfire の創立者で、現在 CEO を務めています。『PHP Programming Solutions』および『How to do Everything with PHP and MySQL』の著者でもあります。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


Adobe、Adobe ロゴ、PostScript、および PostScript ロゴは、Adobe Systems Incorporated の米国およびその他の国における登録商標または商標です。 IBM、IBM ロゴ、ibm.com、DB2、developerWorks、Lotus、Rational、Tivoli、WebSphere、および pureXML は、International Business Machines Corporation の米国およびその他の国における商標です。 Java およびすべての Java 関連の商標およびロゴは、Sun Microsystems, Inc. の米国およびその他の国における商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。

    日本IBMについて プライバシー お問い合わせ