XMLデータの利用 (3/3)
作成:2012-08-05 17:39
更新:2012-08-05 17:39
更新:2012-08-05 17:39
■ノードを操作する
単純にXMLのデータを取り出し出力するだけなく、XMLのデータをいろいろと操作したい場合はどうするのでしょうか。例えば、新たなノードを追加したり、既にあるノードを削除したりといったことですね。こうしたノードの編集作業について整理しましょう。
・ノードの値の操作
これは、実は簡単です。既にノードを指定する方法はわかっていますから、指定したノードに新しい値を代入すればいいのです。例えば、先のXMLデータで最初の<data>にある<name>の値を変更したければ、こんな具合にします。
・ノードの追加
ノードの追加は、追加したいノードの「addChild」というメソッドを呼び出します。これは以下のようにします。
例えば、先のXMLデータで、最初の<data>に<maker>というノードを追加したければ、以下のようになるでしょう。
・ノードの削除
削除は、実は専用のメソッドなどは用意されていません。どうするかというと、そのノードのプロパティをunsetしてしまえばいいのです。例えば、先のXMLデータで最初の<data>を削除したければ、このようにすればよいでしょう。
・属性の操作
ノードには、値の他に属性というものも用意できます。値というのは、例えば<data>hoge</data>というタグがあった場合の「hoge」に相当するものですね。これとは別に、<data name="a">hoge</data>というように<data>タグ内に属性を用意しておくこともXMLではできます。
この属性は、「addAttribute」というメソッドで簡単に追加することができます。
では、ノードと属性を操作する簡単なサンプルを下にあげておきましょう。先ほどのdata.xmlをロードし、その内容を編集し新たなノードを追加してXMLデータとして出力します。ここでは、<data>内の<version>の値を変更し、<price>を削除しています。また新たに<otherdata>というノードを用意し、number属性とnameノードを追加しています。
修正されたSimpleXMLElementは、「asXML」というメソッドを使ってXMLのソースコードとして出力しています。このasXMLは、そのまま引数などを付けずに呼び出せば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の内容をそのまま書きだすのに便利ですね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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();
※関連コンテンツ