XMLの生成

仕事で軽いXMLの組み立てをする必要があって、DOM関数をわざわざ使うのも大げさだし、テンプレートエンジンでぐりぐりループさせるのもなぁと思って、ふと思い出したのが「わびさび方式」。

詳しくは以下のURLを見ていただくとして、qwikWebで使用されている実にRubyらしいHTML/XMLの表現方法である。

http://jp.rubyist.net/magazine/?0012-qwikWeb

上記のURLの抜粋だが以下のような表現ができる。

html = [:html,
  [:head,
    [:title, 'hello']],
  [:body,
    [:h1, 'hello, world!'],
    [:p, 'This is a ',
      [:a, {:href=>'hello.html'}, 'hello, world'],
      ' example.']]]

Rubyのシンボル、配列、Hash、普通の文字列をうまく使用して言語仕様のみでタグを表してしまっている。これをPHPでなんとかできんやろかと考えたのが以下の方式。

  • タグは配列
  • 配列の先頭の文字列はタグ名
  • 先頭以降には配列、連想配列、文字列が要素として入る
  • 配列はタグ(最初のルール)
  • 連想配列は属性のリスト(※1)
  • 文字列はテキスト

PHPの配列は全て連想配列だが、上記のルールでは配列のキーが数字以外だったら連想配列とするという割り切ったルールにしている。

PHPわびさび(勝手に仮称)で上記のRubyの例を書くと以下のようになる(目を細めると同じに見える?)。

$html = array('html',
  array('head',
    array('title', 'hello')),
  array('body',
    array('h1', 'hello, world!'),
    array('p1',
      'This is a ',
      array('a,', array('href' => 'hello.html'), 'hello, world'),
      ' example.')));

これはあくまでも一気に書いたパターンで、以下のように組み立てていくこともできる。

$head = array('head');
$head[] = array('title', 'hello');

$p = array('p');
$p[] = 'This is a ';
$p[] = array('a', array('href' => 'hello.html'), 'hello, world'));
$p[] = ' example.';

$body = array('body');
$body[] = array('h1', 'hello, world!');
$body[] = $p;

$html = array('html');
$html[] = $head;
$html[] = $body;

PHPの array(...) というのは相変わらずうっとうしいと思うが、[]= という形式でタグをばんばん追加できるという気軽さはいい感じなのではと思ってたりします。PHPは配列関連のメソッドがいろいろ準備されているので、うまくやれば加工もしやすいかなと。

現状、これでできた配列をXML化するクラスは準備してますが、パーサーやXPathの軽めのものを準備すればちょっとしたWebサービスXMLを返却みたいなのは組みやすくなるかなと思ってたりします。

id:bobchinさんが以前作られていたAmrita試作版とうまく組み合わせると簡単なテンプレートエンジンができちゃうかもと思っていたりするんですが、またタイミングをみて試してみると面白いかなと。