 

Most simple DSL for DOM / XMLWriter @ PHP
Download Source Code<?php
require_once 'XML/Builder.php';
echo XML_Builder::factory()
->root
    ->hello_('world')
->_;<?xml version="1.0" encoding="UTF-8"?> <root> <hello>world</hello> </root>
PHPでXMLを組み立てるためのライブラリです。
PEARパッケージ形式でOpenpearに登録してあるため、pearコマンドで簡単にインストールできます。
    # pear channel-discover openpear.org
    # pear install openpear/XML_Builder
pearコマンドが使えない環境では、githubからソースをダウンロードして、include_pathにlibの中身をコピーすればOK。
なお、このページ自体もXML_Builderを使って書いています。ソースはsrc/index.html.phpから参照できます。
XML_Builderオブジェクトを生成します。引数は配列で渡します。
| name | default value | description | 
|---|---|---|
| class | dom | バックエンドを選択します。dom/xmlwriter/arrayのいずれかを指定します。 | 
| formatOutput | true | 出力を整形するかどうか | 
| version | 1.0 | 出力するXMLのバージョン。<?xml version="1.0"?>のversionです。 | 
| encoding | UTF-8 | 出力するXMLの文字コード。<?xml version="1.0" encoding="UTF-8"?>のencodingです。 | 
| doctype | null | DOCTYPE宣言。array('HTML',null,null)などのように3要素の配列で渡します。よく使いそうなHTML関係のものはXML_Builderクラスのstatic変数として定義してあります。 | 
| writeto | memory | XMLWriter専用。XMLWriterが書きだす先を指定します。ファイル名を書けばそのファイルに直接書き込みますし、php://outputを指定すれば標準出力にどんどん書きだしていきます。 | 
| serializer | var_export | Array専用。->_echoしたときに適用するcallbackを指定します。ex) json_encode, yaml_emit, XML_Builder::json, serialize | 
このXML_Builder::factory()でビルダーオブジェクトを作り、以下のmethodをmethod chainでつなげて書いていきます。
$builder = XML_Builder::factory(array(
    'class' => 'dom',
    'doctype' => XML_Builder::$HTML4_STRICT,
));
$nameという名前の要素を作成して現在編集中の要素に追加します。戻り値は作成した要素になります。
| //以下はすべて同じ意味
->root
->root()
->xmlElem('root') | <root> | 
名前空間付きの要素や、記号を含む要素の場合は{'〜'}で囲う必要があります。
| //以下はすべて同じ意味
->{'atom:feed'}
->{'atom:feed'}()
->xmlElem('atom:feed') | <atom:feed> | 
現在の要素の編集を終え、親の要素に戻ります。
| ->root ->_ | <root/> | 
現在編集中の要素に属性を追加します。配列で渡します。
| ->root
    ->_attr(array('moge'=>'fuga','noge'=>'guga'))
->_ | <root moge="fuga" noge="guga"/> | 
現在編集中の要素にテキストノードを追加します。
| ->root
    ->_text('hogehoge')
->_ | <root>hogehoge</root> | 
xmlElem(), xmlAttr(), xmlText(), xmlEnd()の組み合わせには省略記法が用意されています。
"_"で終わるように要素名を書くと、その要素の編集を終了します。->xmlEnd()をすぐに呼んだのと同じ効果です。
属性や単純なテキストノードであれば、要素の引数として渡すことでも追加できます。
| //--同じ意味-----
->root
    ->_attr(array('aaa'=>'bbb'))
    ->_text('hogehoge')
->_
//--------
->root_(array('aaa'=>'bbb'), 'hogehoge')
//--混ざっていてもOK------
->root(array('aaa'=>'bbb'))
    ->_text('hogehoge')
->_ | <root aaa="bbb">hogehoge</root> | 
ここではDOMバックエンド特有の機能を紹介します。
XML_Builderによって構築されたDOMDocumentオブジェクトが格納されています。
出力を行います。引数にhtmlという文字列を渡すと、DOMによるHTML出力を試みます。
ここではXMLWriterバックエンド特有の機能を紹介します。
XMLWriterオブジェクトが格納されています。
ここではArrayバックエンド特有の機能を紹介します。
構築された入れ子の配列が格納されています。