【PHP入門】完全マスター!XMLを自由自在に扱う方法まとめ

こんにちは!オータケです!

今回はXMLの読み込みと読み込んだデータへのアクセスの仕方などを解説したいと思います!

現在、様々な場面で使われておりRSSリーダーを作る際に用いられたり、Webサイトのスクレイピングに用いられるなど幅広く活躍しています。

しかし、実際にXMLデータを扱うとなるとデータの量が多かったり構造を把握しづらいなど、少し分かりづらいこともあるかと思います。

この記事を読んでいただければ、

[基礎] XMLとはなにか
[基礎]simplexml_load_fileを使ってXMLデータを読み込む方法
[実践]データのJSON形式、配列への変換方法

といった内容について解説しており、PHPでXMLを扱う方法をわかりやすく解説していきます!

この記事を読み終える頃にはXMLの扱い方についてマスターできているかと思います!

XMLとは

まず、XMLとはなんでしょうか?

一言で簡単に表現すればデータと文章が一緒になった見やすいHTMLのようなものと言えるでしょう。

そもそもHTMLがわからないよ・・・

という人はこちらをご覧ください。

HTMLとは?初心者でも分かる基礎知識から書き方まで詳しく解説
更新日 : 2020年6月22日

XMLにはHTMLと違い、タグ名やタグの属性などを自由に決めることができます。

XMLは単体で使うというよりはプログラム言語を用いてデータ処理を行うために用いることが多いです。

今回もPHPを使ってXMLデータを読み込み、データの中身にアクセスしてみようかとおもいます。

そして、今回の記事では実践的な例として総務省の新着情報のニュースフィード(RSS)を読み込んでみたいと思います。

http://www.soumu.go.jp/news.rdf

RSSもデータ構造はXMLであるためこれを元に解説を進めていきたいと思います。

simplexml_load_fileを使って読み込む方法

使用にはSimpleXMLが必要

PHPでXMLを読み込む手段がいくつかありますが、簡単なSimpleXMLという機能を使って読み込んでみたいと思います。

SimpleXMLという機能をPHPで使うには拡張機能をインストールしていないと使えないという点があります。

ただし、通常はこの機能はONになっているためソースからコンパイルするなどの場合を除いては大抵使える場合が多いでしょう。

この機能がONになっている状態で話を進めていきます。

読み込んでみる

では先程の総務省の新着情報のニュースフィードデータを読み込んで見ましょう!

サンプルをご覧ください。

<?php

$xml = simplexml_load_file('http://www.soumu.go.jp/news.rdf');

print_r($xml);

?>

実行結果:

SimpleXMLElement Object
(
    [channel] => SimpleXMLElement Object
        (
            [title] => 総務省 ホームページ新着情報
            [link] => http://www.soumu.go.jp/
            [description] => 総務省 ホームページ新着情報
            [items] => SimpleXMLElement Object
                (
                )

        )

    [item] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [title] => 熊本地震による被災市町村における任期付職員の募集について
                    [description] => 熊本地震による被災市町村における任期付職員の募集について
                    [link] => http://www.soumu.go.jp/menu_kyotsuu/important/kinkyu02_000278.html
                )

            [1] => SimpleXMLElement Object
                (
                    [title] => 情報通信審議会 情報通信技術分科会 技術戦略委員会(第20回)
                    [description] => 情報通信審議会 情報通信技術分科会 技術戦略委員会(第20回)
                    [link] => http://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/joho_tsusin/gijutsusenryaku/02tsushin03_04000304.html
                )

            [2] => SimpleXMLElement Object
                (
                    [title] => 野田総務大臣閣議後記者会見の概要
                    [description] => 野田総務大臣閣議後記者会見の概要
                    [link] => http://www.soumu.go.jp/menu_news/kaiken/01koho01_02000692.html
                )

            [3] => SimpleXMLElement Object
                (
                    [title] => 第62回施設・研修等分科会(会議資料)
                    [description] => 第62回施設・研修等分科会(会議資料)
                    [link] => http://www.soumu.go.jp/main_sosiki/singi/kanmin/02shingi06_02000309.html
                )

            [4] => SimpleXMLElement Object
                (
                    [title] => 電波法施行規則の一部を改正する省令案等についての意見募集
                    [description] => 電波法施行規則の一部を改正する省令案等についての意見募集
                    [link] => http://www.soumu.go.jp/menu_news/s-news/01kiban15_02000168.html
                )

            [5] => SimpleXMLElement Object
                (
                    [title] => 宇宙利用の将来像に関する懇話会(第1回)
                    [description] => 宇宙利用の将来像に関する懇話会(第1回)
                    [link] => http://www.soumu.go.jp/main_sosiki/kenkyu/space_utilization/02tsushin05_04000065.html
                )

            [6] => SimpleXMLElement Object
                (
                    [title] => 情報通信審議会 情報通信技術分科会 放送システム委員会 IP放送作業班(第2回)の開催について
                    [description] => 情報通信審議会 情報通信技術分科会 放送システム委員会 IP放送作業班(第2回)の開催について
                    [link] => http://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/joho_tsusin/housou_system/02ryutsu12_04000131.html
                )

            [7] => SimpleXMLElement Object
                (
                    [title] => 第502回入札監理小委員会(会議資料)
                    [description] => 第502回入札監理小委員会(会議資料)
                    [link] => http://www.soumu.go.jp/main_sosiki/singi/kanmin/02shingi06_02000308.html
                )

            [8] => SimpleXMLElement Object
                (
                    [title] => 災害情報伝達手段への一斉送信機能の導入促進に関する検討会の開催
                    [description] => 災害情報伝達手段への一斉送信機能の導入促進に関する検討会の開催
                    [link] => http://www.soumu.go.jp/menu_news/s-news/01shoubo01_02000058.html
                )
以下省略...

このように読み込むことができています。

読み込んで返してくる値はSimpleXMLElementというオブジェクトの配列を返します。

次の項ではこれらのデータにアクセスし自分の使いやすい形に加工してみましょう!

タイトルだけ抽出してみる

先程は読み込むことに成功したので今度はRSSフィードの中からタイトルだけ抽出してみましょう。

<?php

$xml = simplexml_load_file('http://www.soumu.go.jp/news.rdf');

print_r((string)$xml->item->title);
?>

特定の要素にアクセスする場合には上記のように要素(タグ)名を記載し、アローでつなげながら下の階層にたどっていきます。

今回の場合は

<item>
  <title>~~~</title>
  <description>~~~</description>
  以下省略
</item>

のような形になっているためitem要素の下の階層にtitle要素が存在する形になります。

この時、item要素は幾つもあるため配列のように扱うことができます。
要素番号を指定しない場合は0番目の要素を指定したことと同義になります。

<?php

$xml = simplexml_load_file('http://www.soumu.go.jp/news.rdf');

print_r((string)$xml->item[3]->title);
?>

実行結果:

第62回施設・研修等分科会(会議資料)

では実践的な使い方として、タイトルだけ抽出して配列化してみましょう。

<?php
$xml = simplexml_load_file('http://www.soumu.go.jp/news.rdf');

$size = count($xml->item);
$result = [];

for($i = 0; $i < $size; $i++)
{
    $result[] = (string)$xml->item[$i]->title;
}

print_r($result);
?>

このようにすることでタイトルだけを抽出した配列を作ることができます。

しかし、XMLの構造が違う場合はその都度、アクセスするためのコードを書き換えなければならないため注意が必要です。

JSON形式へ変換

次にこの項ではsimplexml_load_fileで読み込んだXMLデータをJSON化してみましょう。

<?php
$xml = simplexml_load_file('http://www.soumu.go.jp/news.rdf');
$json = json_encode($xml);

print_r($json);
?>

たったこれだけで実現することが可能です。

ただし、幾つか注意点があります。

まず要素に属性がついていた場合その属性は無視されます。

例えば次のような要素があった場合にrdf:aboutという属性と属性の値は出力されません。

<item rdf:about=”~~~”>
</item>

次に、XMLデータ内にCDATAと呼ばれるデータが入っている場合も正しくJSON化できない場合があります。

もし、CDATAが原因で正しくJSON化できなかった場合は次のようにsimple_xml_load_fileにオプションを指定するとよいでしょう。

<?php
$xml = simplexml_load_file('http://www.soumu.go.jp/news.rdf', NULL, LIBXML_NOCDATA);
$json = json_encode($xml);

print_r($json);
?>

こうすることで、CDATAが取り除かれたテキストデータだけになります。

では次に配列に変換してみましょう。

配列へ変換

次に配列に変換してみたいと思います。

直接、配列に変換する方法がないため少し回りくどいですがJSONに変換したあとにそのJSONデータを配列に変換するという方法を取ります。

<?php
$xml = simplexml_load_file('http://www.soumu.go.jp/news.rdf');
$json = json_decode(json_encode($xml), TRUE);

var_dump($json);
?>

こうすることで配列にすることができましたね!

ポイントはjson_decode関数の第二引数にTRUEをつけるということです。

これをつけることでJSON形式のデータを変換して配列として返してくれるようになります。

ここまでがSimpleXMLを使ったXMLデータの読み込み+アクセス方法でした。

XMLデータを出力する方法

読み込みについて解説してきましたが、XMLデータを出力する場合にはどうすればよいでしょうか?

例えば自作のメディアやサイトを作成した際にRSSフィードを配信したいとなった際にはXMLフォーマットで出力する必要があるかと思います。

出力方法については次の記事でしっかり解説をしております!

【PHP入門】意外と簡単!DOMDocumentを使ったXMLに出力する方法まとめ
更新日 : 2018年5月22日

SimpleXMLを使った方法とDOMDocumentを使った方法でそれぞれ解説しており、出力時の注意点なども解説されているため興味があればぜひご覧ください!

まとめ

いかがだったでしょうか?

SimpleXMLを使った方法とDOMDocumentを使った2種類のXMLデータ読み込みについて解説しました。

用途にあった形でお好きな方を使っていただければ良いかと思います。

ただ、簡単に扱える方はどちらかと聞かれたらSimpleXMLのほうが簡単ではないかと私は思います。

では今回はここまで。

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

オータケ

30歳、フリーランスプログラマ。中学の頃よりプログラミングに興味を持ちゲーム開発やWebサイト構築などを経験
新しいフレームワークやライブラリに興味があり革新的な機能が含まれていると泣いて喜ぶ。

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー