SabelにはXMLを扱うクラス群が用意されていて、簡単にXML(DOM)を扱うことができます。
まず、DOMからXML文書を作成する基本的なコード例を示します。
$doc = Sabel_Xml_Document::create();
$root = $doc->createElement("root");
$doc->setDocumentElement($root); // root要素をドキュメント要素(ルート)にセット
$parents = $root->addChild("parents"); // root要素の子要素としてparents要素を追加
$p1 = $parents->addChild("parent"); // parents要素の子要素としてparent要素を追加
$p1->at("name", "p1"); // parent要素のname属性にp1をセット
$children1 = $p1->addChild("children");
$children1->addChild("child1")->at("name", "p1c1");
$children1->addChild("child2")->at("name", "p1c2");
$p2 = $parents->addChild("parent");
$p2->at("name", "p2");
$children2 = $p2->addChild("children");
$children2->addChild("child1")->at("name", "p2c1");
$children2->addChild("child2")->at("name", "p2c2");
echo $doc->toXML(); // XMLとして出力
addChild()メソッド は指定した名前の要素を作成し、その要素を返します。つまり、以下の2つは同じ動作をします。
$elem要素に"foo"要素を追加する
$foo = $doc->createElement("foo");
$elem->appendChild($foo);
----------------------------------------------------
$foo = $elem->addChild("foo");
また、at()メソッド は setAttribute()メソッド のエイリアスで、引数が1つの場合は getAttribute()メソッド の代わりとなります。
$elem->at("key", "value");
$elem->setAttribute("key", "value");
----------------------------------------------------
echo $elem->at("key");
echo $elem->getAttribute("key");
上記のサンプルコードで出力される(組み立てられる)XMLは下記のようなものとなります。
<?xml version="1.0" encoding="utf-8"?>
<root>
<parents>
<parent name="p1">
<children>
<child1 name="p1c1"/>
<child2 name="p1c2"/>
</children>
</parent>
<parent name="p2">
<children>
<child1 name="p2c1"/>
<child2 name="p2c2"/>
</children>
</parent>
</parents>
</root>
要素の中身のテキストをセットするには setNodeValue()メソッド を使用してください。第2引数に true を渡すと
CDATAセクション としてセットすることができます。
...
$p1 = $parents->addChild("parent");
$p1->at("name", "p1");
$children1 = $p1->addChild("children");
$p1c1 = $children1->addChild("child1");
$p1c1->at("name", "p1c1")->setNodeValue("aaa");
$p1c2 = $children1->addChild("child2");
$p1c2->at("name", "p1c2")->setNodeValue("<b>bold</b>", true);
...
XMLとして出力すると、要素の中身がセットされていることが分かります。
...
<parent name="p1">
<children>
<child1 name="p1c1">aaa</child1>
<child2 name="p1c2"><![CDATA[<b>bold</b>]]></child2>
</children>
</parent>
...
なお、対象の要素が子要素を持っている場合に setNodeValue()メソッド を実行すると、それら子要素(テキストノードも含め)は全て削除されます。テキスト要素を追加したい場合は addText()メソッド を使用してください。setNodeValue()メソッド同様、第2引数に true を渡すと CDATAセクション として追加されます。
echo $elem->getNodeValue(); // "text"
$elem->addText("_text1");
echo $elem->getNodeValue(); // "text_text1"
XML文書として保存する場合は saveXML() にファイルパスを渡してください。
$doc->saveXML("/path/to/test.xml");