「PHP言語」で「XML」「JSON」データの「読み込み」と「作成」を行う方法を勉強しよう!
WEB上の通信される「データフォーマット」についてや、PHPでそれらのデータを扱う方法について学んでいきたいと思います。
WEB上で扱われるデータフォーマットでは、「XML」と「JSON」がよく利用されているとのことでした。
少しずつ「WEBの仕組み」や「サーバーのプログラムの書き方」を学んでいますが、まだまだ学ぶことが多くて先が長そうです(^^;)
「XML」の仕組み
WEBのデータ通信で利用される「XML(Extensible Markup Language)」について学んでいきたいと思います。
「XML」についていろいろと調べてみると、「HTMLの仲間」みたいな存在だということがわかってきました。
「独自のタグ」なども自由に作れるとのことでした。
といっても、難しいものは全然できないので、簡単なものを作ってみたいと思います。
今回は、「衣服」の情報を保存できるXMLデータを作っていくことにしました。
<?xml version="1.0"?> <items> <item id='1'> <name>パーカー</name> <price>5200</price> <color>gray</color> <material>スウェット</material> </item> <item id='2'> <name>カットソー</name> <price>2700</price> <color>white</color> <material>コットン</material> </item> <item id='3'> <name>ワンピース</name> <price>6200</price> <color>brown</color> <material>ポリエステル</material> </item> <item id='4'> <name>チノパン</name> <price>7500</price> <color>white</color> <material>コットン・ポリウレタン</material> </item> <item id='5'> <name>テーラードジャケット</name> <price>8200</price> <color>black</color> <material>ポリエステル・綿</material> </item> </items>
このファイルをPHPで読み込むために、「SimpleXML」というモジュールを利用していきます。
XMLデータの読み込み
このモジュールの中に「XML」データを読み込むための「simplexml_load_file」という関数があります。
この関数の引数にXMLデータを渡すと「SimpleXMLElement」クラスのオブジェクト返ってくるのですが、このオブジェクトを利用することで、「XML」データの操作を行うことができます。
XMLデータのファイルを読み込んで、表示するプログラムを作ってみると、
$xml = simplexml_load_file('sample.xml'); foreach( $xml->item as $item){ print '<p>【id】' . $item['id'] . '【name】=' . $item->name . ' 【price】=' . $item->price . ' 【color】=' . $item->color . ' 【nmaterial】=' . $item->material . '</p>'; }
のようになりました。
「オブジェクト」のプロパティに「XML」のそれぞれのデータが格納されているので、「->」のアロー演算子でプロパティの値を取り出すことができます。
本来はインターネットで通信を行って、「サーバー」から「XMLデータ」を取得して表示するなどの使い方をするそうです。
XMLの「要素の属性値」は、「ブラケット」で囲んで「属性名」を指定すると、「属性値」も取得することができます。
XMLデータの作成と出力
XMLのコードは、PHPから作成することもできます。
例えば、
$code = "<?xml version='1.0' encoding='UTF-8' ?><items></items>"; $items = new SimpleXMLElement($code); $item = $items->addChild('item', ''); $item->addChild('name','パーカー'); $item->addChild('price','5200'); $item->addChild('color','gray'); $item->addChild('material','スウェット'); print $items->asXML();
のように、まず「SimpleXMLElement」クラスのインスタンスを作り、「addChild」メソッドで子要素を追加していきます。
最後に「asXML」メソッドでXMLコードを出力しています。
出力結果を確認してみると、
<?xml version="1.0" encoding="UTF-8"?> <items> <item> <name>パーカー</name> <price>5200</price> <color>gray</color> <material>スウェット</material> </item> </items>
のように出力されます。
WEB API開発などでは、データベースから情報を取り出してXMLコードを生成する処理が使われているとのことでした。
データベースがあまりよくわかっていないので、今後勉強していきたいと思います。
JSON
「JSON(JavaScript Object Notation)」も、XMLと同じくさまざまなデータの集まりを表現できる仕組みです。
タグを用いず「階層構造」のデータを作ることができますが、今回は「フルーツ」をテーマにJSONデータを作ってみたいと思います。
シンプルなJSONデータを作ってみると、
{"文字列" : "値"}
のようになります。
「値を識別するための文字列」と「値」を「:(コロン)」で区切って指定していきます。
「値」の中にさらに「文字列と値」を入れていくこともできるため、「階層構造」を作ることができます。
例えば、
{"fruits": [ { "type":"apple", "price":280 }, { "type":"melon", "price":780 }, { "type":"orange", "price":300 }, { "type":"grape", "price":870 }, { "type":"peach", "price":450 } ] }
のように「fruits」の値に「配列形式」で複数の値を格納することができて、「配列」を表すときは「ブラケット」で囲みます。
JSONデータの読み込み
PHPでJSONデータを読み込むためには、「json_decode」関数を利用します。
$result_decode = json_decode($json); var_dump($result_decode);
引数に「JSONデータ」を渡すと、戻り値にJSONデータを含んだオブジェクトが返ってきます。
オブジェクトの内容を出力して整形してみると、
object(stdClass)#6 (1) { ["fruits"]=> array(5) { [0]=> object(stdClass)#1 (2) { ["type"]=> string(5) "apple" ["price"]=> int(280) } [1]=> object(stdClass)#2 (2) { ["type"]=> string(5) "melon" ["price"]=> int(780) } [2]=> object(stdClass)#3 (2) { ["type"]=> string(6) "orange" ["price"]=> int(300) } [3]=> object(stdClass)#4 (2) { ["type"]=> string(5) "grape" ["price"]=> int(870) } [4]=> object(stdClass)#5 (2) { ["type"]=> string(5) "peach" ["price"]=> int(450) } } }
のようにPHPであらかじめ用意されている「stdClass」のオブジェクトのプロパティにデータが格納されるようになっています。
プロパティのデータを参照するには、
foreach( $result_decode->fruits as $data ){ print 'type=' . $data->type . ' price=' . $data->price . '
'; }
のように、プログラムを書くと、
type=apple price=280 type=melon price=780 type=orange price=300 type=grape price=870 type=peach price=450
のように表示されます。
JSONデータの作成
PHPで「JSONデータ」を作成する方法として、「オブジェクト」を元に作る方法があります。
今回は、
class Fruits { public $type; public $price; function __construct($type, $price){ $this->type = $type; $this->price = $price; } }
のように「フルーツ」を表すクラスを作ってみました。
「オブジェクト」から「JSONデータ」を作るには、「json_encode」関数の引数に、「JSONに変換したいオブジェクト」を渡すと「JSONデータ」を文字列として取得することができます。
「json_encode」関数を利用したプログラムは、
$pine = new Fruits('pine','870'); $pine_json = json_encode($pine); var_dump($pine_json);
のように作りました。
これを実行してみると、
string(29) "{"type":"pine","price":"870"}"
のように表示され、ちゃんと「JSONデータ」を文字列で取得することができました。