SimpleXMLElement Objectの参照
内容
久しぶりにxmlをパースする処理を書いていたんだけど、SimpleXMLElement Objectの参照方法を忘れていたのでメモをしておく。(20120416追記) 今まではサンプルプログラム中のforeachで$resultに添字$iでインクリメントして値を代入していましたが、$iを使わずに配列の[]を使って右辺のarray型を代入するように修正しました。
xmlサンプル
<?xml version="1.0" encoding="Shift-Jis" ?> <venture> <company> <name>ソフトバンク株式会社</name> <url>http://www.softbank.co.jp/</url> </company> <company> <name>楽天株式会社</name> <url>http://www.rakuten.co.jp/info/</url> </company> </venture>
simplexml_load_string関数
PHPの関数によりSimpleXMLElement ObjectとしてParseを行う。SimpleXMLElement Objectを更にPHP配列に整形してゆく。
<?php $xml = <<<XML <?xml version="1.0" encoding="Shift-Jis" ?> <venture> <company> <name>ソフトバンク株式会社</name> <url>http://www.softbank.co.jp/</url> </company> <company> <name>楽天株式会社</name> <url>http://www.rakuten.co.jp/info/</url> </company> </venture> XML; print( $xml . "\n" ); $data = simplexml_load_string( $xml ); print_r( $data );
simplexml_load_string関数の実行結果
xmlがSimpleXMLElement Objectに変換されていることが分かる。
SimpleXMLElement Object ( [company] => Array ( [0] => SimpleXMLElement Object ( [name] => ソフトバンク株式会社 [url] => http://www.softbank.co.jp/ ) [1] => SimpleXMLElement Object ( [name] => 楽天株式会社 [url] => http://www.rakuten.co.jp/info/ ) ) )
SimpleXMLElement Objectの値参照
SimpleXMLElement ObjectのNodeはアロー演算子で参照可能。
<?php (略) $data = simplexml_load_string( $xml ); print_r( $data ); foreach( $data->company as $value ) { $result[] = array( 'name' => $value->name, 'url' =>$value->url ); } print_r( $result );
アロー演算子で参照した値
下はまだSimpleXMLElement Objectの参照になっている。完全なphp配列にしたい。
Array ( [0] => Array ( [name] => SimpleXMLElement Object ( [0] => ソフトバンク株式会社 ) [url] => SimpleXMLElement Object ( [0] => http://www.softbank.co.jp/ ) ) [1] => Array ( [name] => SimpleXMLElement Object ( [0] => 楽天株式会社 ) [url] => SimpleXMLElement Object ( [0] => http://www.rakuten.co.jp/info/ ) ) )
castを使って値を格納する
配列に格納する場合はSimpleXMLElement ObjectのNodeをcastさせる。上のphpプログラムを次のように変更する。
<?php (略) $data = simplexml_load_string( $xml ); print_r( $data ); foreach( $data->company as $value ) { $result[] = array( 'name' => (string)$value->name, 'url' => (string)$value->url ); } print_r( $result );
castの実行結果
これで純粋なphp配列に置き換えることができた。
Array ( [0] => Array ( [name] => ソフトバンク株式会社 [url] => http://www.softbank.co.jp/ ) [1] => Array ( [name] => 楽天株式会社 [url] => http://www.rakuten.co.jp/info/ ) )