目次

パース

当投稿では、 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

同じカテゴリの投稿(PHP)

前後の投稿