PHPのSimpleXMLElementでXMLの各要素の文字列を取得できない原因と解決方法(ルート要素を指定してしまった場合)

PHP公式サイトのSimpleXMLElementのマニュアルを見ながら、SimpleXMLElementでXMLの各要素の文字列を取得しようとしたところ、取得できず、1時間ほどハマってしまった。

《参考にしたサイト》
PHP マニュアル ›関数リファレンス ›XML 操作 ›SimpleXML ›例 「基本的な SimpleXML の使用法」
http://php.net/manual/ja/simplexml.examples-basic.php

このマニュアルを見ながら、以下のXMLとPHPプログラムを作成。

■XMLファイル(ファイル名:test.xml)
<?xml version='1.0' encoding='UTF-8'?>
<english>
<record>
<word>cat</word>
<trans>猫</trans>
</record>
<record>
<word>犬</word>
<trans>dog</trans>
</record>
</english>

■PHPプログラム(ファイル名:test.php) ※正しく動作しないプログラム
<?php
$english_file = file_get_contents('./english.xml');
$english_xml = new SimpleXMLElement($english_file);
echo $english_xml->english->record[0]->word;
?>

これで、test.phpを実行すると、「cat」が表示されると思ったのだが、何も表示されなかった。(PHPエラーも表示されなかった。)

再度、PHP公式サイトのマニュアルを見ていると、気付いたことがあった。

PHP公式サイトのサンプルプログラム
echo $movies->movie[0]->plot;
と公式サイトのサンプルXMLを見比べると、公式サイトでは、XMLのルート要素「<movies>」を指定する記述がないことに気付いた。

そこで、私のプログラムも修正することにした。

【修正前】
echo $english_xml->english->record[0]->word; ※間違ってルート要素「<english>」が指定されている。

【修正後】
echo $english_xml->record[0]->word; ※ルート要素「<english>」を指定しない。

修正後の記述で、期待通り、「cat」が表示されるようになった。

XMLのルート要素は1つしかないから、SimpleXMLElementで指定する必要がない、という仕様なのだろう。

PHPのSimpleXMLElementでXMLの各要素の文字列を取得できない原因は、間違ってルート要素まで指定していたことにあった。

次回からは、PHPのSimpleXMLElementでXMLの各要素の文字列を取得する場合、間違ってルート要素まで指定しないように気をつけようと思った。

前へ

PHPエラー「Parse error: syntax error, unexpected '/', expecting ')'」の原因と解決方法

次へ

JR松山駅の始発に乗る時はみどりの窓口と売店の営業開始時間に注意