PHPで名前空間プレフィックスを扱う例

名前空間プレフィックスがあるXMLファイルをPHPにsimplexml_load_fileで変換した場合の属性にアクセスするための方法を、livedoor天気APIで地域設定に使う 全国の地点定義表(RSS)のXMLファイルを例にメモ書きします。

【XMLファイルの例(全国の地域定義表より)】

<channel>
  <ldWeather:provider  name="日本気象協会" link="http://tenki.jp/" /> 
  <ldWeather:source title="全国" link="http://weather.livedoor.com/forecast/rss/index.xml">
    <pref title="道北">
      <warn  title="警報・注意報" source="http://weather.livedoor.com/forecast/rss/warn/01a.xml" /> 
      <city  title="稚内" id="011000" source="http://weather.livedoor.com/forecast/rss/area/011000.xml" /> 
      <city  title="旭川" id="012010" source="http://weather.livedoor.com/forecast/rss/area/012010.xml" /> 
      <city  title="留萌" id="012020" source="http://weather.livedoor.com/forecast/rss/area/012020.xml" /> 
    </pref>
    <pref title="道東">
      <warn  title="警報・注意報" source="http://weather.livedoor.com/forecast/rss/warn/01c.xml" /> 
      <city  title="網走" id="013010" source="http://weather.livedoor.com/forecast/rss/area/013010.xml" /> 
      <city  title="北見" id="013020" source="http://weather.livedoor.com/forecast/rss/area/013020.xml" />
    </pref>
  </ldWeather:source>
</channel>

「ldweather:provider」や「ldWeather:source」などコロンがあるXMLデータをsimplexml_load_fileで取得して表示しようとしても、そのままですとechoなどを使用してもプレフィックス部分のXMLデータは表示されません。

プレフィックス部分のデータにアクセスするには、例えば、「ldWeather:source」にある属性「title」の値を取得する場合は、channelの子要素を取得するのにchildren()を使い、そのあとにプレフィックス名を設定、次に属性を取得するattributes()を設定して最後に属性名を設定します。

$xml = simplexml_load_file($base_url);
echo $xml->channel->children('ldWeather', true)->source->attributes()->title;

また、上記のXMLデータから地域idと地域名を取得(表示)するには、下のコードでできます。simplexml_load_fileでXMLファイルを取得したあと、2行目のコードで「ldWeather:source」の子要素を取得、foreachでxmlデータの各prefにある子要素を取得していくコードになります。

地域名とidを取得(表示)するので、prefの子要素にあるcity要素だけ取り出すので、getName()で要素を取得して比較しています。

$xml = simplexml_load_file($base_url);
$xml = $xml->channel->children('ldWeather', true)->source->children();
foreach( $xml as $pref ) {
  foreach( $pref->children() as $pchild ) {
    if( $pchild->getName() == 'city' ) {
      echo $pchild->attributes()->title;
      echo $pchild->attributes()->id . '<br />';
    }
  }
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です