InDesign CS3でFTP, HTTP通信を行う (4)

今回はサーバー上にあるXMLデータを処理する場合についてです。

サーバー上にあるのはHTMLファイルやテキストファイルだけではありません。XMLファイルも多くあります。XMLはコンピュータープログラムで処理しやすいように作られているため、再利用しやすいというメリットがあります。InDesignはXMLと組み合わせてページレイアウトすることもできますが、これとは別にスクリプトで細かく処理していくことが可能です。
 ここでは、XML形式としてはもっとも多く使われているRSSを読み込みInDesignに配置するプログラムについて説明します。ここではasahi.comで配信されているRSSを読み込み利用することにします。なお、RSSにはいくつかのバージョンがありますが、ここでは日本国内で多く使われているRSS 1.0 (RDF) を利用しています。
 XMLデータを読み込む場合も、これまでのHTMLファイル、テキストファイルを読み込む方法と同じです。異なるのはXMLデータの処理です。正規表現を使って処理する方法もありますが、InDesign CS3からXMLデータを処理するためのオブジェクトが追加されています。
 読み込まれたXMLデータは、ただのテキストファイルです。これをプログラムで扱えるようにする(ドキュメントオブジェクトモデルに変換する)にはnew XML()のパラメータにXMLデータ(ただのテキスト状態のもの)を指定します。これにより、XMLオブジェクトが生成され、用意された命令を使ってXMLデータにアクセスできるようになります。XMLオブジェクトへのアクセスに関しては以下のURLからダウンロードできるJavaScript Tools Guide CS3を参照してください。

http://www.adobe.com/devnet/bridge/pdfs/javascript_tools_guide_cs3.pdf

 XMLデータにアクセスする方法はいくつか用意されていますが、ここではchild()を使います。child()は子ノードを示すものでパラメータに子ノードの参照番号を指定します。最初の子ノードが0になり、次の子ノードが1というように1ずつ増えていきます。配信されているRSSでは0番目は<channel>で、次が<item>になります。記事のタイトルは<item>内にある<title>にあります。<title>〜</title>内にある文字を取り出すにはtext()を使います。
まとめると、記事のタイトルを取り出すには以下のようにアクセスすることになります。

xmlObj.child(参照番号).child(0).text()

実際のプログラムがサンプル4になります。最新記事を10個読み込みInDesign上の最前面のドキュメントに配置します。

--------------------------------------------------------------
【RSSの構造】
<rdf:RDF>
<channel>〜</channel>
<item>
<title>記事のタイトル</title>

</item>
 記事の数だけ<item>〜</item>が繰り返される
--------------------------------------------------------------



// RSS (XML) ファイルを読み込みInDesign上に配置する
(function(){
var CR = String.fromCharCode(13);
var tfObj = app.activeDocument.textFrames.add();
tfObj.visibleBounds = ["2cm", "3cm", "10cm", "14cm"];
var fileObj = getHttpData("http://rss.asahi.com/f/asahi_newsheadlines", "~/tempXML.xml");
var flag = fileObj.open("r");
if(flag == true){
var xmlText = fileObj.read(); // XMLファイル内容を全て読み込む
var xmlObj = new XML(xmlText); // XMLオブジェクトを生成
var text = "";
for(var i=1; i<=10; i++){
var newsName = xmlObj.child(i).child(0).text();
text = text + newsName + CR;
}
tfObj.contents = text;
fileObj.remove(); // 一時的に作成したファイルを削除
}
})();
// HTTPを使って指定されたサーバーのデータを読み込みファイルオブジェクトを返す
function getHttpData(sURL, filePath){
if ( !ExternalObject.webaccesslib ) {
ExternalObject.webaccesslib = new ExternalObject("lib:webaccesslib");
}
var http = new HttpConnection(sURL) ;
http.response = new File(filePath) ;
http.execute() ;
http.response.close() ;
return new File(filePath);
}
 

[サンプルをダウンロード]