libro
www.tuyano.com
初心者のためのPHPプログラミング入門

XMLデータの利用 (3/3)

作成:2012-08-05 17:39
更新:2012-08-05 17:39

■ノードを操作する

単純にXMLのデータを取り出し出力するだけなく、XMLのデータをいろいろと操作したい場合はどうするのでしょうか。例えば、新たなノードを追加したり、既にあるノードを削除したりといったことですね。こうしたノードの編集作業について整理しましょう。

・ノードの値の操作
これは、実は簡単です。既にノードを指定する方法はわかっていますから、指定したノードに新しい値を代入すればいいのです。例えば、先のXMLデータで最初の<data>にある<name>の値を変更したければ、こんな具合にします。
$xml->data[0]->name = "値";
これで、最初の(つまりゼロ番目の)<data>にある<name>の値が新しいものに変更されます。もし、nameというノードがなければ新たに追加します。(このあとにaddChildというメソッドを説明しますが、実をいえばこんな具合にノードの名前を指定して値を設定すれば、addChildを使わなくてものーどをついかできちゃったりします)

・ノードの追加
ノードの追加は、追加したいノードの「addChild」というメソッドを呼び出します。これは以下のようにします。
ノード->addChild( 名前 , 値 );
第1引数にノードの名前を、第2引数に設定される値をそれぞれ用意します。また第3引数に名前空間を指定することで、「○○というところにノードを追加する」というように追加する場所を指定することもできます。まぁ、とりあえずは第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>というように<data>タグ内に属性を用意しておくこともXMLではできます。

この属性は、「addAttribute」というメソッドで簡単に追加することができます。
ノード->addAttribute( 名前 , 値 );
こんな具合ですね。とても簡単なのですが、ではその他の値の更新や削除は?というと、実は専用のメソッドは用意されていません。「attributes」というメソッドで、ノードに用意されている全属性をSimpleXMLElementにまとめて取り出すことはできるのですが、既にある属性を削除するなどの仕組みはSimpleXMLにはないようです。


では、ノードと属性を操作する簡単なサンプルを下にあげておきましょう。先ほどのdata.xmlをロードし、その内容を編集し新たなノードを追加してXMLデータとして出力します。ここでは、<data>内の<version>の値を変更し、<price>を削除しています。また新たに<otherdata>というノードを用意し、number属性とnameノードを追加しています。

修正されたSimpleXMLElementは、「asXML」というメソッドを使ってXMLのソースコードとして出力しています。このasXMLは、そのまま引数などを付けずに呼び出せばXMLのソースコードをテキスト値として返します。修正したXMLの内容をそのまま書きだすのに便利ですね。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

<?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();

※関連コンテンツ

「初心者のためのPHPプログラミング入門」に戻る