jOOXを使えば、JavaでもjQueryのようにXMLを操作できる

拙著『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らしい、悪く言えば冗長なコードです。「標準的」ということにこだわらなければ、ここで紹介したような、もっと簡単な方法があるのです。