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でなんとかできんやろかと考えたのが以下の方式。
※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試作版とうまく組み合わせると簡単なテンプレートエンジンができちゃうかもと思っていたりするんですが、またタイミングをみて試してみると面白いかなと。