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つの引数を指定すればよい。

また、関数を呼び出す方式ではなく、オブジェクトであるSimpleXMLElementnewで作る方法もある。これにもいくつか引数があるが、まず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の利用は非常に簡単であることがわかるだろう。