
「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データ」を文字列で取得することができました。