如何获得5天雅虎天气预报

时间:2013-03-12 14:39:13

标签: php xml rss yahoo-weather-api

我一直在为我的网站制作天气预报。

我目前只能获得接下来两天的预测。我想要接下来5天的预测。

这是我的代码:

$ipaddress = $_SERVER['REMOTE_ADDR'];
$locationstr = "http://api.locatorhq.com/?user=MYAPIUSER&key=MYAPIKEY&ip=".$ipaddress."&format=xml";

$xml = simplexml_load_file($locationstr);

$city = $xml->city;

switch ($city)
{
    case "Pretoria":
        $loccode = "SFXX0044";

        $weatherfeed = file_get_contents("http://weather.yahooapis.com/forecastrss?p=".$loccode."&u=c");
        if (!$weatherfeed) die("weather check failed, check feed URL");
        $weather = simplexml_load_string($weatherfeed);

        readWeather($loccode);
        break;
}

function readWeather($loccode)
{
    $doc = new DOMDocument();
    $doc->load("http://weather.yahooapis.com/forecastrss?p=".$loccode."&u=c");

    $channel = $doc->getElementsByTagName("channel");

    $arr;
    foreach($channel as $ch)
    {
        $item = $ch->getElementsByTagName("item");
        foreach($item as $rcvd)
        {
            $desc = $rcvd->getElementsByTagName("description");

            $_SESSION["weather"] = $desc->item(0)->nodeValue;
        }
    }
}

我想引导您注意查询天气的行:

$doc = new DOMDocument();
$doc->load("http://weather.yahooapis.com/forecastrss?p=".$loccode."&u=c");

// url resolves to http://weather.yahooapis.com/forecastrss?p=SFXX0044&u=c in this case

搜索谷歌,我发现this link建议我使用此网址:

$doc->load("http://xml.weather.yahoo.com/forecastrss/SFXX0044_c.xml");

虽然这也有效,但我在XML文件中看到了5天的预测,我仍然只能在我的网站上看到2天的预测。

我有一种感觉,这是因为我正在利用RSS提要中找到的channel子元素,而XML提要没有这样的子元素。

如果有人能在这里提供任何见解,我将非常感激。

1 个答案:

答案 0 :(得分:1)

这是我过早提问的原因......

当我再次查看我的代码时,我注意到我将yahooapis URL引用了两次:一次在交换机中,另一次在readWeather中。

删除了冗余引用并按照提到的线程更新了url,我发现它现在可以正常工作。

请参阅更新的代码以供参考:

switch ($city)
{
    case "Pretoria":
        $loccode = "SFXX0044";

        readWeather($loccode);
        break;
}

function readWeather($loccode)
{
    $doc = new DOMDocument();
    $doc->load("http://xml.weather.yahoo.com/forecastrss/".$loccode."_c.xml");

    $channel = $doc->getElementsByTagName("channel");

    $arr;
    foreach($channel as $ch)
    {
        $item = $ch->getElementsByTagName("item");
        foreach($item as $rcvd)
        {
            $desc = $rcvd->getElementsByTagName("description");

            $_SESSION["weather"] = $desc->item(0)->nodeValue;
        }
    }
}