まずは、
取得したXMLをsimplexml_load_string()でsimplexmlオブジェクトに展開する。
$xml = file_get_contents($rss); $w = simplexml_load_string($xml);後は、
default namespaceの要素を取得するなら、
引数なしでchildren()と実行し、
$ch = $w->channel->children();namespaceの指定がある要素を取得するなら、
children($namespace) と引数ありで実行するだけ。
$ch = $w->channel->children($namespace);全体はこんな感じ。
$ cat weather.php
<?php
$rss = "http://weather.yahooapis.com/forecastrss?w=2348079&u=c";
$xml = file_get_contents($rss);
if(!$xml) exit(1);
$w = simplexml_load_string($xml);
$yw = "http://xml.weather.yahoo.com/ns/rss/1.0";
$geo = "http://www.w3.org/2003/01/geo/wgs84_pos#"
// default namespace <channel><title>
$ch = $w->channel->children();
foreach($ch as $k => $v){
if($k === "lastBuildDate") $weather[$k] = $v;
}
// <channel><yweather>
$ch = $w->channel->children($yw);
foreach($ch as $category => $kv){
foreach($kv->attributes() as $k => $v){
$category = (string)$category;
$k = (string)$k;
$v = (string)$v;
$weather[$category][$k]=$v;
}
}
// <channel><item><geo>
$ch = $w->channel->item->children($geo);
foreach($ch as $k => $v){
$k = (string)$k;
$v = (string)$v;
$weather["location"][$k] = $v;
}
// <channel><item><yweather>
$item = $w->channel->item->children($yw);
foreach($item as $category => $kv){
foreach($kv->attributes() as $k => $v){
$category = (string)$category;
$k = (string)$k;
$v = (string)$v;
if($k === "day" && $category === "forecast") $day = $v;
if($category === "forecast"){
$weather[$category][$day][$k] = $v;
}
else{
$weather[$category][$k] = $v;
}
}
}
print_r($weather);
?>
実行すると$ php weather.php
Array
(
[location] => Array
(
[city] => Auckland
[region] =>
[country] => New Zealand
[lat] => -36.88
[long] => 174.77
)
[units] => Array
(
[temperature] => C
[distance] => km
[pressure] => mb
[speed] => km/h
)
[wind] => Array
(
[chill] => 11
[direction] => 270
[speed] => 24.14
)
[atmosphere] => Array
(
[humidity] => 94
[visibility] => 9.99
[pressure] => 1015.92
[rising] => 0
)
[astronomy] => Array
(
[sunrise] => 6:43 am
[sunset] => 7:32 pm
)
[condition] => Array
(
[text] => Rain Shower
[code] => 11
[temp] => 11
[date] => Mon, 11 Oct 2010 2:00 am NZDT
)
[forecast] => Array
(
[Mon] => Array
(
[day] => Mon
[date] => 11 Oct 2010
[low] => 8
[high] => 13
[text] => Showers
[code] => 11
)
[Tue] => Array
(
[day] => Tue
[date] => 12 Oct 2010
[low] => 12
[high] => 16
[text] => Partly Cloudy
[code] => 30
)
)
)
便利だね、simplexml!!
0 件のコメント:
コメントを投稿