2009/12/12

[gadget]外部にあるxmlを非同期で取得しパースする方法

今、PhotoShareのiGoogle gadgetを作成しています。

そこでxmlを取得し、パースするという処理があるのですが、iGoogle gadgetの場合、ブラウザなどの諸々の問題を意識せずに簡単に行なうことができます。

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="test"
directory_title="test"
title_url="http://widgmedia.com/"
description=""
author="maito.kuwahara"
author_location="Japan"
author_affiliation=""
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_link="http://temping-amagramer.blogspot.com/"
screenshot=""
thumbnail=""
author_photo="http://widgmedia.com/gadget/my_profile_photo.png"
height="350"
>

</ModulePrefs>
<Content type="html">
<![CDATA[
<div id="outline"></div>
<script type="text/javascript">

function lf_init(){
var url = "http://feeds.bcphotoshare.com/users/hoge.atom";
var params = {};
params[gadgets.io.ContentType] = gadgets.io.ContentType.XML;

gadgets.io.makeRequest(url,lf_response,params);

}

gadgets.util.registerOnLoadHandler(lf_init);

/* 解析結果を受け取るファンクション */
function lf_response(obj){
var domdata = obj.data;
/* 解析エラー */
if(domdata == undefined
|| domdata == null
|| typeof(domdata) != "object"
|| domdata.firstChild == null
){
document.getElementById("outline").innerHTML = 'Error occured.';
return false;
}
/* 正常終了の場合 */

}
</script>
]]>
</Content>
</Module>

gadgets.io.makeRequest(url,lf_response,params)という関数でxmlの取得及び解析を頼むのですが、まず第一引数に取得したいurlを指定します。

続いて第二引数に処理が終わった後のコールバック関数を設定します。
(lambdaでもオッケーなのが便利なところ)

最後の第三引数の部分ですが、これはパラメータで、今回、params[gadgets.io.ContentType] = gadgets.io.ContentType.XMLと設定することで、urlをxmlとして取得を行ない解析しますよーという指示を出しています。
これは必須となる引数です。

で処理が終わった後は、コールバック関数(上記のプログラムの場合lf_responseなのですが)で正常終了か異常終了か判断を行ないます。

ポイントとなるのは戻り値.dataとすることで初めてDOMで処理ができるということ。

この点を注意しておかないとドツボにはまりそうです。

ちなみに、下の画像は、異常終了した時に画像です(文言が多少違うかも)
Photobucket

0 コメント:

コメントを投稿