PHP入門 | XMLデータの利用 | ノードを操作する
単にXMLデータを取り出して出力するだけでなく、XMLデータをさまざまに操作しなければならない場合がある。例えば、新しいノードを追加したり、既存のノードを削除したりする操作である。このようなノードの編集作業について見ていこう。
ノードの値を操作する
これは非常に簡単である。すでにノードを指定する方法は分かっているはずなので、その指定したノードに新しい値を代入すればよい。例えば、前のXMLデータで最初の<data>の<name>値を変更したい場合は、次のようにすればよい。
$xml->data[0]->name = "値";
こうすると、最初、つまり0番目の<data>の<name>値が新しく変更される。もしnameというノードがなければ新しく追加される。後でaddChildというメソッドを説明するが、実はこのようにノード名を指定して値を設定すれば、addChildを使わなくてもノードを追加できる。
ノードの追加
ノードを追加するには、追加先のノードでaddChildというメソッドを呼び出す。これは次のようにする。
ノード->addChild(名前, 値);
1番目の引数にノード名を、2番目の引数に設定する値をそれぞれ指定する。また、3番目の引数に名前空間を指定して、「OOという場所にノードを追加する」のように追加先を指定することもできる。とにかく、まずは1番目と2番目の引数だけ分かれば、ノードの追加は簡単にできるようになる。
例えば、前のXMLデータで最初の<data>に<maker>というノードを追加したい場合は、次のようにすればよい。
$xml->data[0]->addChild('maker', 'microsoft');
ノードの削除
実は削除専用のメソッドはなく、該当ノードのプロパティをunsetしてしまえばよい。例えば、前のXMLデータで最初の<data>を削除したい場合は、次のようにする。
unset ($xml->data[o]);
属性の操作
ノードには値のほかに属性というものもある。例えば、<data>hoge</data>というタグがある場合、"hoge"が値になる。これとは別に、<data name="a">hoge</data>のように、XMLでは<data>タグ内に属性を指定できる。
この属性はaddAttributeというメソッドで簡単に追加できる。
ノード->addAttribute(名前, 値);
このようにすればよい。非常に簡単だが、その他の値の更新や削除に関する専用メソッドは用意されていない。attributesというメソッドでノードに含まれているすべての属性をSimpleXMLElementとして抽出できるが、既存の属性を削除するような機能はSimpleXMLにはない。
それでは、ノードと属性を操作する例を見てみよう。
<?php
$arr = array('one', 'two', 'three');
$xml = new SimpleXMLElement("data.xml", 0, true);
for($i = 0; $i < count($arr); $i++) {
$xml->data[$i]->version = $arr[$i];
unset($xml->data[$i]->price);
$newdata = $xml->addChild("otherdata", "");
$newdata->addAttribute("number", $i + 1);
$newdata->addChild("name", $arr[$i]);
}
header('content-type:text/xml;charset=utf-8');
echo $xml->asXML();
前のdata.xmlファイルを読み込み、その内容を編集して新しいノードを追加し、XMLデータとして出力する。ここでは<data>内の<version>値を変更し、<price>を削除する。また、新しく<otherdata>というノードを作成し、number属性とnameノードを追加する。
修正されたSimpleXMLElementは、asXMLというメソッドを使ってXMLソースコードとして出力する。このasXMLメソッドを引数なしで呼び出すと、XMLソースコードをテキスト値として返す。修正したXML内容をそのまま表示するのに便利である。