PHP入門 | XMLデータの利用 | XMLとSimpleXML
PHPにはXMLを処理する機能がいくつも用意されている。PHP 5以前は複数の関数を呼び出して処理していたが、PHP 5からはオブジェクトとして処理する方式が追加された。ここでは、その中の1つであるSimpleXMLという機能を利用してXMLを操作してみよう。
SimpleXMLは文字どおり、XMLを利用するための非常に簡単な機能である。これはXMLファイルやテキストからデータを読み込み、SimpleXMLElementというクラスのインスタンスを作る。このオブジェクトにあるメソッドなどを呼び出してXMLデータを処理する。
XMLファイルからオブジェクトを生成する。
$変数 = simplexml_load_file(ファイル指定);
テキスト値からオブジェクトを生成する。
$変数 = simplexml_load_string(テキスト);
これらの関数は、第1引数にファイル、つまりファイル名やファイルパス、またはXMLテキストを指定してオブジェクトを作る。実際にはこれらの関数にはさらに引数が用意されているが、まず指定データからXMLオブジェクトを生成するだけなら、1つの引数を指定すればよい。
また、関数を呼び出す方式ではなく、オブジェクトであるSimpleXMLElementをnewで作る方法もある。これにもいくつか引数があるが、まず3つの引数を使う方法は次のとおりである。
SimpleXMLElementを生成する
$変数 = new SimpleXMLElement(データ, オプション, 真偽値);
第1引数はXMLデータである。これはXMLテキストでもよいし、XMLファイルのURLを指定してもよい。第2引数のオプション値は指定するものだが、まずは0を指定する。0はオプションがない場合の値である。
第3引数の真偽値は、第1引数のデータがファイルかどうかを指定する。第1引数にXMLテキストを指定している場合はfalse、または省略してもよい。ファイルのURLを指定しているならtrueにする。ファイルからデータを取得する場合、この第3引数がtrueに設定されていないとオブジェクト生成に失敗するため、必ず指定しなければならない。
これで、XMLデータを処理するためのSimpleXMLElementオブジェクトを作れるようになった。
XMLファイルの作成
それではXMLを操作する例として、簡単なXMLデータを作成してみよう。次のコードサンプルどおりに作成すればよい。
data.xml
<?xml version="1.0" encoding="UTF-8"?>
<datas>
<data>
<name>Windows</name>
<version>9</version>
<price>99</price>
</data>
<data>
<name>Mac</name>
<version>15</version>
<price>99999</price>
</data>
<data>
<name>Linux</name>
<version>123.4567</version>
<price>0</price>
</data>
</datas>
これはdata.xmlというファイル名で、PHPファイル、たとえば今回作成するindex.phpなどと同じ場所に配置しておく。
SimpleXMLElementのデータを取得する
SimpleXMLElementにはさまざまなメソッドが用意されている。それらのメソッドを利用して、XMLから必要な情報を取得できる。
SimpleXMLElementから必要な情報を取得するもっとも簡単な方法は、該当するノードをプロパティとして指定して取得することである。
$変数 = $オブジェクト->ノード;
このように書く。ここで「ノード」とは、XMLデータに書かれている1つ1つのタグだと考えればよい。これはSimpleXMLElementオブジェクトとして生成され、各タグごとにオブジェクトになっている。この個別の要素を表すオブジェクトをノードと呼ぶこともある。
XMLでは、同じ名前のノードが同じ階層に複数存在することがある。そのような場合は、そのノードを表すオブジェクトを配列として取得する。したがって、指定したノードを取得し、それを繰り返しなどで順番に処理していけば、複数のノードを処理できる。
実際の使用例を作ってみよう。
<?php
$data = "";
$xml = new SimpleXMLElement("data.xml",0,true);
$data_arr = $xml->data;
foreach ($data_arr as $row) {
$data .= "<tr>";
$data .= "<td>" . $row->name . "</td>";
$data .= "<td>" . $row->version . "</td>";
$data .= "<td>" . $row->price . "</td>";
$data .= "</tr>";
}
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
<title>sample page</title>
<style>
h1 { font-size:14pt;
padding:5px;
background-color:#AAFFFF; }
table tr td {
padding:5px;
background-color:#DDFFCC; }
</style>
</head>
<body>
<h1>Hello PHP!</h1>
<table>
<tr><th>Name</th><th>Version</th><th>Price</th></tr>
<?php echo $data; ?>
</table>
</body>
</html>
ここでは、先ほどのdata.xmlを読み込んで表示している。このdata.xmlファイルでは、ルートに<datas>というタグがあり、その中の<data>というタグにデータが保存されている。このデータには製品名、バージョン、価格などの値が保存されている。
このファイルを、ここでは次のように読み込んでいる。
$xml = new SimpleXMLElement("data.xml", 0, true);
data.xmlからSimpleXMLElementのオブジェクト変数$xmlを作り、そこから<data>タグのノードをまとめて取得する。
$data_arr = $xml->data;
上のように、$xml->dataとしてノード名を指定し、ノードを取り出す。とても簡単である。その後は、繰り返しで1つ1つのノードを処理している。
foreach ($data_arr as $row) {...... 中略
このようにすると、ノードオブジェクトの配列から順番にオブジェクトを$rowへ取り出し、この$rowから各要素の値を取り出してテキストを作っていく。
$data .= "<td>" . $row->name . "</td>";
$data .= "<td>" . $row->version . "</td>";
$data .= "<td>" . $row->price . "</td>";
基本的な使い方がわかれば、XMLの利用は非常に簡単であることがわかるだろう。