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の各要素の文字列を取得する場合、間違ってルート要素まで指定しないように気をつけようと思った。