Fork me on GitHub

php-XML_Builder

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を組み立てるためのライブラリです。

Feature

Easy
とにかく短く書けます。
Safe
DOMやXMLWriterといった実績のあるライブラリのラッパーとして動作します。そのためXSSのような不具合が原理的に発生しません。
DOM and XMLWriter supported
バックエンドとして、高機能なDOM・高速なXMLWriterのいずれかを選択できます。どちらを選んでも同じインターフェースで書けます。
to Array
おまけ機能として、同一インターフェースで配列を組み立てる機能があります。XML/JSON/YAML/PHPSerializeの出し分けが簡単に行えます。

Install

from Openpear

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::factory()

XML_Builderオブジェクトを生成します。引数は配列で渡します。

options
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,
));

Methods

  • 引数がない場合は()を省略することができます。
  • 「xml」から始まる正式名と、「_」から始まる省略名があります。「xml~」の方がやや高速に動作します。

->xmlElem($name), ->$name

$nameという名前の要素を作成して現在編集中の要素に追加します。戻り値は作成した要素になります。

//以下はすべて同じ意味
->root
->root()
->xmlElem('root')
<root>

名前空間付きの要素や、記号を含む要素の場合は{'〜'}で囲う必要があります。

//以下はすべて同じ意味
->{'atom:feed'}
->{'atom:feed'}()
->xmlElem('atom:feed')
<atom:feed>

->xmlEnd(), ->_

現在の要素の編集を終え、親の要素に戻ります。

->root
->_
<root/>

->xmlAttr(), ->_attr()

現在編集中の要素に属性を追加します。配列で渡します。

->root
    ->_attr(array('moge'=>'fuga','noge'=>'guga'))
->_
<root moge="fuga" noge="guga"/>

->xmlText(), ->_text()

現在編集中の要素にテキストノードを追加します。

->root
    ->_text('hogehoge')
->_
<root>hogehoge</root>

->$name_(array(), "string")

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>

XML_Builder_DOM

ここではDOMバックエンド特有の機能を紹介します。


Additional Properties

->xmlDom

XML_Builderによって構築されたDOMDocumentオブジェクトが格納されています。

Additional Methods

->xmlEcho($type="xml")

出力を行います。引数にhtmlという文字列を渡すと、DOMによるHTML出力を試みます。

XML_Builder_XMLWriter

ここではXMLWriterバックエンド特有の機能を紹介します。


Additional Properties

->xmlWriter

XMLWriterオブジェクトが格納されています。

XML_Builder_Array

ここではArrayバックエンド特有の機能を紹介します。


Additional Properties

->xmlArray

構築された入れ子の配列が格納されています。