拙著『Webアプリケーション構築入門』では、「Webアプリを作れるようになる前に、使えるようになろう」という考えから、いくつかのWeb APIの利用方法を早い段階で紹介しています。多くの場合、Web APIを使うためには、XMLやJSONなどのデータをプログラムから操作できなければなりません。本書では、Twitterのパブリックタイムラインを題材にして、JavaでXMLを処理する方法やPHPやJavaScript(jQuery)でJSONを処理する方法を紹介しています。
追記:TwitterのAPIが変わってしまったので、シミュレータを使うようにしました。(参考:Twitter APIのパブリックタイムラインが亡くなっていました)
しかし、jOOXのようなライブラリを使うと、拙著で紹介したよりも簡単に、JavaでもjQuery風にXMLを操作できます。というのが、今日のお話。
p.72で紹介している、つぶやきの本文だけを取り出して表示するコードは次のようになります。(p.86などを参考に、joox-バージョン番号.jarを使えるようにしてから試してください。)
import java.net.*; import org.joox.*; import static org.joox.JOOX.*; public class JooxPublicTimeline { public static void main(String[] args) throws Exception { URL url = new URL("http://labs.unfindable.net/public_timeline/xml.php"); $(url.openStream()).find("text").each(new Each() { @Override public void each(Context cntxt) { System.out.println($(cntxt.element()).text()); } }); } }
.each()
の中にラムダ式を書けないのがつらいところで、この例のように無名インナークラス(p.181)を使わなければなりません。.find()
のあとに.each()
とすればListが返るので、それをfor
文で回して・・・、としたくなるところですが、jQueryらしく書くとこんな感じでしょう。
p.73で紹介している、「名前: つぶやきの本文」という形式で表示するコードは次のように書き換えられます。
import java.net.*; import org.joox.*; import static org.joox.JOOX.*; public class JooxPublicTimeline2 { public static void main(String[] args) throws Exception { URL url = new URL("http://labs.unfindable.net/public_timeline/xml.php"); $(url.openStream()).find("status").each(new Each() { @Override public void each(Context cntxt) { Match status = $(cntxt.element()); String text = status.child("text").text(); String name = status.find("user>name").text(); System.out.println(name + ": " + text); } }); } }
拙著で紹介しているJavaでXMLを処理する方法は標準的なものではありますが、よく言えばJavaらしい、悪く言えば冗長なコードです。「標準的」ということにこだわらなければ、ここで紹介したような、もっと簡単な方法があるのです。