DOMの操作 | XML & DOM

ここでの例として、下記のXML文書を使用します。
<?xml version="1.0" encoding="utf-8"?>
<root>
  <a at="1"/>
  <b at="2"/>
  <c at="3"/>
</root>

要素の追加

子要素を追加するには addChild() または appendChild() の2つの方法があります。既に要素がある場合は、appendChild() を使用すると良いでしょう。
$doc = Sabel_Xml_Document::create();
$root = $doc->load("XML", "/path/to/test.xml");

$d = $doc->createElement("d")->at("at", "4");
$root->appendChild($d);

echo $doc->toXML();
<?xml version="1.0" encoding="utf-8"?>
<root>
  <a at="1"/>
  <b at="2"/>
  <c at="3"/>
  <d at="4"/>
</root>
まだ要素がない場合には、addChild() を使用することができます。第1引数には要素名を、第2引数には要素の値を指定できます。なお、addChild()メソッド の戻り値は追加されたその要素のため、それに対し属性などを付加することができます。
...

$d = $root->appendChild("d", "hoge");
$d->at("d", "4");

echo $doc->toXML();
<?xml version="1.0" encoding="utf-8"?>
<root>
  <a at="1"/>
  <b at="2"/>
  <c at="3"/>
  <d at="4">hoge</d>
</root>

要素の挿入

ある要素の前後に新たな要素を追加することができます。例えば b要素 の前に d要素 を挿入するには、下記のようにします。
$doc = Sabel_Xml_Document::create();
$root = $doc->load("XML", "/path/to/test.xml");

$d = $doc->createElement("d")->at("at", "4");
$root->b->insertPreviousSibling($d);

echo $doc->toXML();
<?xml version="1.0" encoding="utf-8"?>
<root>
  <a at="1"/>
  <d at="4"/>
  <b at="2"/>
  <c at="3"/>
</root>
後に追加するには、insertNextSibling()メソッド を使用します。
...

$root->b->insertNextSibling($d);

echo $doc->toXML();
<?xml version="1.0" encoding="utf-8"?>
<root>
  <a at="1"/>
  <b at="2"/>
  <d at="4"/>
  <c at="3"/>
</root>

要素の削除

要素を削除するには、その要素のremove()メソッドを実行するだけです。
例えば b要素 を削除する場合は、下記のようなコードとなります。非常にシンプルです。
$doc = Sabel_Xml_Document::create();
$root = $doc->load("XML", "/path/to/test.xml");
$root->b->remove();

echo $doc->toXML();
<?xml version="1.0" encoding="utf-8"?>
<root>
  <a at="1"/>
  <c at="3"/>
</root>

要素の交換

a要素 と c要素 を入れ替えるには、swap()メソッド を使用します。swap()メソッド は兄弟要素間でのみ使用可能なことに注意してください。
$doc = Sabel_Xml_Document::create();
$root = $doc->load("XML", "/path/to/test.xml");

$a = $root->a[0];
$c = $root->c[0];
$a->swap($c);

echo $doc->toXML();
<?xml version="1.0" encoding="utf-8"?>
<root>
  <c at="3"/>
  <b at="2"/>
  <a at="1"/>
</root>
なお、「aをcと入れ替える」と「cをaと入れ替える」は同じことなので、下記でもよいことになります。
$c->swap($a);