i am using yahoo weather API
$result = file_get_contents('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22Sarajevo%22)&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys');
$xml = simplexml_load_string($result);
//echo htmlspecialchars($result, ENT_QUOTES, 'UTF-8');
$xml->registerXPathNamespace('yweather', 'http://xml.weather.yahoo.com/ns/rss/1.0');
$weather_location = $xml->channel->xpath('yweather:location');
if(!empty($weather_location)){
foreach($xml->channel->item as $item){
$forecast = $item->xpath('yweather:forecast');
$time = time();
$wdate = strtotime($forecast[$i]['day']);
echo "".(string)$wdate.""; // Wed
echo "<span><b>".(int)$forecast[$i]['high']."°</b>";// 8
echo " ".(int)$forecast[$i]['low']."°</span>"; // 19
}
}
Sample XML:
<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
yahoo:count="1" yahoo:created="2016-03-31T10:56:53Z" yahoo:lang="en-US">
<results>
<channel>
<yweather:units
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
distance="mi" pressure="in" speed="mph" temperature="F"/>
<title>Yahoo! Weather - Sarajevo, Federacija Bosne I Hercegovine, BA</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Country__Country/*https://weather.yahoo.com/country/state/city-943828/</link>
<description>Yahoo! Weather for Sarajevo, Federacija Bosne I Hercegovine, BA</description>
<language>en-us</language>
<lastBuildDate>Thu, 31 Mar 2016 12:56 PM CEST</lastBuildDate>
<ttl>60</ttl>
<yweather:location
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
city="Sarajevo" country="Bosnia and Herzegovina" region=" Federacija Bosne I Hercegovine"/>
<yweather:wind
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
chill="70" direction="270" speed="4"/>
<yweather:atmosphere
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
humidity="43" pressure="922.0" rising="0" visibility="16.1"/>
<yweather:astronomy
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
sunrise="6:27 am" sunset="7:14 pm"/>
<image>
<title>Yahoo! Weather</title>
<width>142</width>
<height>18</height>
<link>http://weather.yahoo.com</link>
<url>http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif</url>
</image>
<item>
<title>Conditions for Sarajevo, Federacija Bosne I Hercegovine, BA at 12:00 PM CEST</title>
<geo:lat xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">43.853161</geo:lat>
<geo:long xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">18.38493</geo:long>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Country__Country/*https://weather.yahoo.com/country/state/city-943828/</link>
<pubDate>Thu, 31 Mar 2016 12:00 PM CEST</pubDate>
<yweather:condition
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="32" date="Thu, 31 Mar 2016 12:00 PM CEST"
temp="69" text="Sunny"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="30" date="31 Mar 2016" day="Thu" high="70"
low="41" text="Partly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="28" date="01 Apr 2016" day="Fri" high="72"
low="50" text="Mostly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="30" date="02 Apr 2016" day="Sat" high="68"
low="44" text="Partly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="30" date="03 Apr 2016" day="Sun" high="69"
low="45" text="Partly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="30" date="04 Apr 2016" day="Mon" high="69"
low="47" text="Partly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="30" date="05 Apr 2016" day="Tue" high="69"
low="47" text="Partly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="30" date="06 Apr 2016" day="Wed" high="69"
low="47" text="Partly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="28" date="07 Apr 2016" day="Thu" high="66"
low="49" text="Mostly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="28" date="08 Apr 2016" day="Fri" high="58"
low="50" text="Mostly Cloudy"/>
<yweather:forecast
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
code="28" date="09 Apr 2016" day="Sat" high="58"
low="47" text="Mostly Cloudy"/>
<description><![CDATA[<img src="http://l.yimg.com/a/i/us/we/52/32.gif"/>
<BR />
<b>Current Conditions:</b>
<BR />Sunny
<BR />
<BR />
<b>Forecast:</b>
<BR /> Thu - Partly Cloudy. High: 70Low: 41
<BR /> Fri - Mostly Cloudy. High: 72Low: 50
<BR /> Sat - Partly Cloudy. High: 68Low: 44
<BR /> Sun - Partly Cloudy. High: 69Low: 45
<BR /> Mon - Partly Cloudy. High: 69Low: 47
<BR />
<BR />
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Country__Country/*https://weather.yahoo.com/country/state/city-943828/">Full Forecast at Yahoo! Weather</a>
<BR />
<BR />
(provided by <a href="http://www.weather.com" >The Weather Channel</a>)
<BR />
]]></description>
<guid isPermaLink="false"/>
</item>
</channel>
</results>
</query>
This is the result:
Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: Undefined namespace prefix in /home/ugbosnia/public_html/blocks/weather/block.php on line 8
Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: xmlXPathEval: evaluation failed in /home/ugbosnia/public_html/blocks/weather/block.php on line 8
Any suggestion?
The channel
is not a child node of the document element. If you read the XML the document element is query
with a child results
. I suggest storing the channel
in its own variable:
$channel = $xml->results->channel;
You will have to register the namespace on each SimpleXMLElement
before you use its xpath()
method. In your case you register it on the $xml
, But you do not register it on the $channel
or $item
objects.
$xml = simplexml_load_string($result);
$channel = $xml->results->channel;
$channel->registerXPathNamespace('yweather', 'http://xml.weather.yahoo.com/ns/rss/1.0');
$weather_location = $channel->xpath('yweather:location');
if(!empty($weather_location)){
foreach($channel->item as $item){
$item->registerXPathNamespace('yweather', 'http://xml.weather.yahoo.com/ns/rss/1.0');
$forecast = $item->xpath('yweather:forecast');
var_dump($forecast);
}
}
Output:
array(10) {
[0]=>
object(SimpleXMLElement)#8 (1) {
["@attributes"]=>
array(6) {
["code"]=>
string(2) "30"
["date"]=>
string(11) "31 Mar 2016"
["day"]=>
string(3) "Thu"
["high"]=>
string(2) "70"
["low"]=>
string(2) "41"
["text"]=>
string(13) "Partly Cloudy"
}
}
[1]=>
object(SimpleXMLElement)#9 (1) {
...
DOM uses a separate object for the XPath expressions, so you will only have to register the namespace on this object:
$document = new DOMDocument();
$document->loadXml($result);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('yweather', 'http://xml.weather.yahoo.com/ns/rss/1.0');
$weather_location = $xpath->evaluate('//yweather:location');
...