目次
パース
当投稿では、 PHP で XML ファイルを読み込んで、 XML の中に書いてあるデータを取得するテストを行ってみたいと思います。
XML データは、その用途からすると、構造的なデータとして記述されていると思いますが、そのままでは、 PHP から見ると、普通の文字列なので、 PHP のオブジェクトに変換して、データとして扱い易くしてから、 XML の中のデータを取得してみたいと思います。
何かのデータを、何か用に、扱えるように変換することを、パース parse というらしいです。今回の場合は、 XML の文字列のデータを PHP のオブジェクトとして扱えるように、パースを行ってみます。
XML ファイル
まずは、テスト用に、以下の XML ファイルを準備しました。
- data.xml
- https://pulogu.net/wordpress/wp-content/themes/twentysixteen-bootstrap-v3-child/xml/data.xml
data.xml の中身は、以下のソースコードようになっています。
<photo> <name> <width> <height> <url> <thumbnail-url> の各ノードの名前は、私が独自に定義したものです。 <width> <height> の unit="" 属性も私が自由に付けた名前になっています。
ルート要素 <photos> の下に、 <photo> ノードが並んでいます。 <width> と <height> 要素には、 unit 属性を設定しています。あとは、 <thumbnail-url> という、要素名にハイフン( - の記号)の含まれているノードも存在しています。
data.xml のソースコード:
<?xml version="1.0" encoding="UTF-8" ?> <photos> <photo> <name>a.jpg</name> <width unit="pixel">2560</width> <height unit="pixel">1920</height> <url>https://pulogu.net/wordpress/wp-content/uploads/2018/01/a.jpg</url> <thumbnail-url>https://pulogu.net/wordpress/wp-content/uploads/2018/01/a-150x150.jpg</thumbnail-url> </photo> <photo> <name>b.jpg</name> <width unit="inch">35.556</width> <height unit="inch">26.667</height> <url>https://pulogu.net/wordpress/wp-content/uploads/2018/01/b.jpg</url> <thumbnail-url>https://pulogu.net/wordpress/wp-content/uploads/2018/01/b-150x150.jpg</thumbnail-url> </photo> <photo> <name>c.jpg</name> <width unit="mm">903.11</width> <height unit="mm">677.33</height> <url>https://pulogu.net/wordpress/wp-content/uploads/2018/01/c.jpg</url> <thumbnail-url>https://pulogu.net/wordpress/wp-content/uploads/2018/01/c-150x150.jpg</thumbnail-url> </photo> </photos>
PHP のオブジェクトへ変換
というわけで、 PHP の simplexml_load_file という関数を使用して、 XML データを PHP のオブジェクトに変換してみたいと思います。
- PHP: SimpleXML - Manual
- http://php.net/manual/ja/book.simplexml.php
- PHP: simplexml_load_file - Manual
- http://php.net/manual/ja/function.simplexml-load-file.php
以下の、 PHP のソースコードを実行してみます。 simplexml_load_file 関数を使用しています。 var_dump して、結果をみてみます。
PHP のソースコード:
<?php $xml = simplexml_load_file('https://pulogu.net/wordpress/wp-content/themes/twentysixteen-bootstrap-v3-child/xml/data.xml'); //XML ファイルの URL を指定 var_dump( $xml ); //構造を分かりやすく出力 ?>
以下が、 var_dump してみた結果になります。 XML データが、 PHP のオブジェクトに変換されているようです。次のステップで、値の取り出しを行ってみたいと思います。
出力結果:
object(SimpleXMLElement)#3363 (1) { ["photo"]=> array(3) { [0]=> object(SimpleXMLElement)#3362 (5) { ["name"]=> string(5) "a.jpg" ["width"]=> string(4) "2560" ["height"]=> string(4) "1920" ["url"]=> string(61) "https://pulogu.net/wordpress/wp-content/uploads/2018/01/a.jpg" ["thumbnail-url"]=> string(69) "https://pulogu.net/wordpress/wp-content/uploads/2018/01/a-150x150.jpg" } [1]=> object(SimpleXMLElement)#3361 (5) { ["name"]=> string(5) "b.jpg" ["width"]=> string(6) "35.556" ["height"]=> string(6) "26.667" ["url"]=> string(61) "https://pulogu.net/wordpress/wp-content/uploads/2018/01/b.jpg" ["thumbnail-url"]=> string(69) "https://pulogu.net/wordpress/wp-content/uploads/2018/01/b-150x150.jpg" } [2]=> object(SimpleXMLElement)#3360 (5) { ["name"]=> string(5) "c.jpg" ["width"]=> string(6) "903.11" ["height"]=> string(6) "677.33" ["url"]=> string(61) "https://pulogu.net/wordpress/wp-content/uploads/2018/01/c.jpg" ["thumbnail-url"]=> string(69) "https://pulogu.net/wordpress/wp-content/uploads/2018/01/c-150x150.jpg" } } }
値を取得
それでは、値の取り出しを行ってみたいと思います。以下のリンクを参考にして、値の取得を試してみました。
- PHP: 基本的な SimpleXML の使用法 - Manual
- http://php.net/manual/ja/simplexml.examples-basic.php
はじめに、単一のノードから値を取得してみます。
取得したい値は、 1 個目の <photo> 要素の下にある <name> 要素の値としてみます。 XML データでは、「a.jpg」 という値になっています。
PHP のソースコード:
<?php echo $xml->photo[0]->name; ?>
出力結果:
a.jpg
出力結果を見てみると、「a.jpg」となっています。単一のノードからの値の取得に成功したようです。
値を取得(要素名にハイフンを含む)
次は、要素名にハイフン( - の記号)を含む <thumbnail-url> 要素から、値を取得してみます。
取得したい値は、 1 個目の <photo> 要素の下にある <thumbnail-url> 要素の値としてみます。 XML データでは、「https://pulogu.net/wordpress/wp-content/uploads/2018/01/a-150x150.jpg」 という値になっています。
PHP のソースコード:
<?php
echo $xml->photo[0]->{'thumbnail-url'}; //{''} で囲んでいる。
?>
PHP の変数名に使用しない文字、使用できない文字?が含まれている場合は、要素名を、 {''} で囲むようです。
出力結果:
https://pulogu.net/wordpress/wp-content/uploads/2018/01/a-150x150.jpg
出力結果を見てみると、「a-150x150.jpg」で終わる文字列になっています。 a.jpg のサムネイル画像の URL が取得できたようです。
属性値を取得
次は、属性値を取得してみたいと思います。 <width> と <height> 要素に unit という属性値を設定していたので、その値を取得してみます。 XML データは、 pixel , inch , mm の順番になっていました。取得してみます。
PHP のソースコード:
<?php echo $xml->photo[0]->width['unit']."\n"; echo $xml->photo[1]->width['unit']."\n"; echo $xml->photo[2]->width['unit']."\n"; ?>
widht に設定されている、 unit 属性を取得しています。
出力結果:
pixel
inch
mm
pixel , inch , mm の順番に取得できています。成功したようです。
値を取得(ループ処理)
次は、ループ処理で各ノードの値を取り出してみたいと思います。以下の PHP のコードを試してみました。
PHP のソースコード:
<?php foreach ($xml->photo as $photo) { echo "name : " , $photo->name , PHP_EOL; echo "widht : " , $photo->width , $photo->width['unit'] , PHP_EOL; echo "height : " , $photo->height , $photo->height['unit'] , PHP_EOL; echo "url : " , $photo->url , PHP_EOL; echo "thumbnail-url : " , $photo->{'thumbnail-url'} , PHP_EOL; } ?>
PHP_EOL は、 OS 毎に最適な行末文字を出力してくれる PHP の定数のようです。
- PHP: 定義済みの定数 - Manual
- http://php.net/manual/ja/reserved.constants.php
あと echo で出力したい文字を , (カンマ)で区切っています。 . (ピリオド)で連結する方法しか知らなかったので、良い書き方を覚えました。
出力結果:
name : a.jpg
widht : 2560pixel
height : 1920pixel
url : https://pulogu.net/wordpress/wp-content/uploads/2018/01/a.jpg
thumbnail-url : https://pulogu.net/wordpress/wp-content/uploads/2018/01/a-150x150.jpg
name : b.jpg
widht : 35.556inch
height : 26.667inch
url : https://pulogu.net/wordpress/wp-content/uploads/2018/01/b.jpg
thumbnail-url : https://pulogu.net/wordpress/wp-content/uploads/2018/01/b-150x150.jpg
name : c.jpg
widht : 903.11mm
height : 677.33mm
url : https://pulogu.net/wordpress/wp-content/uploads/2018/01/c.jpg
thumbnail-url : https://pulogu.net/wordpress/wp-content/uploads/2018/01/c-150x150.jpg
XML データに含まれている値を、一覧にして出力することができました。応用すれば、 HTML タグで囲んで HTML 要素を生成することもできそうです。
あとがき
とりあえず、 PHP で XML データをパースして使用することができました。 simplexml_load_file 関数で、 PHP のオブジェクトになったのは便利でした。やることがあればですが、 WebAPI サービスで、 XML データを受信した時にも、なんとか、処理できるかもしれません。
以上、閲覧ありがとうございました。
- [ Amazon.co.jp アソシエイト ] PHP 関係の本
- https://amzn.to/41Kpx4Q