目次
パース
当投稿では、 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




