I’m trying to put some weather info on a web page, using data from the xml file below.
<?php
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<data><request><type>Zipcode</type><query>80487</query></request><current_condition><observation_time>10:14 AM</observation_time><temp_C>-2</temp_C><temp_F>29</temp_F><weatherCode>122</weatherCode><weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0004_black_low_cloud.png</weatherIconUrl><weatherDesc>Overcast </weatherDesc><windspeedMiles>16</windspeedMiles><windspeedKmph>26</windspeedKmph><winddirDegree>240</winddirDegree><winddir16Point>WSW</winddir16Point><precipMM>4.3</precipMM><humidity>81</humidity><visibility>16</visibility><pressure>1001</pressure><cloudcover>100</cloudcover></current_condition>
<weather><date>2012-01-22</date><tempMaxC>-4</tempMaxC><tempMaxF>24</tempMaxF><tempMinC>-15</tempMinC><tempMinF>5</tempMinF><windspeedMiles>21</windspeedMiles><windspeedKmph>35</windspeedKmph><winddirection>W</winddirection><winddir16Point>W</winddir16Point><winddirDegree>274</winddirDegree><weatherCode>323</weatherCode><weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0011_light_snow_showers.png</weatherIconUrl><weatherDesc>Patchy light snow</weatherDesc><precipMM>10.9</precipMM></weather>
<weather><date>2012-01-23</date><tempMaxC>-1</tempMaxC><tempMaxF>30</tempMaxF><tempMinC>-15</tempMinC><tempMinF>5</tempMinF><windspeedMiles>8</windspeedMiles><windspeedKmph>12</windspeedKmph><winddirection>SW</winddirection><winddir16Point>SW</winddir16Point><winddirDegree>220</winddirDegree><weatherCode>116</weatherCode><weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png</weatherIconUrl><weatherDesc>Partly Cloudy </weatherDesc><precipMM>0.8</precipMM></weather><weather><date>2012-01-24</date><tempMaxC>-1</tempMaxC><tempMaxF>30</tempMaxF><tempMinC>-14</tempMinC><tempMinF>6</tempMinF><windspeedMiles>9</windspeedMiles><windspeedKmph>14</windspeedKmph><winddirection>W</winddirection><winddir16Point>W</winddir16Point><winddirDegree>274</winddirDegree><weatherCode>119</weatherCode><weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0003_white_cloud.png</weatherIconUrl><weatherDesc>Cloudy </weatherDesc><precipMM>0.6</precipMM></weather><weather><date>2012-01-25</date><tempMaxC>1</tempMaxC><tempMaxF>34</tempMaxF><tempMinC>-15</tempMinC><tempMinF>6</tempMinF><windspeedMiles>6</windspeedMiles><windspeedKmph>9</windspeedKmph><winddirection>SSW</winddirection><winddir16Point>SSW</winddir16Point><winddirDegree>200</winddirDegree><weatherCode>113</weatherCode><weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png</weatherIconUrl><weatherDesc>Sunny</weatherDesc><precipMM>0.1</precipMM></weather><weather><date>2012-01-26</date><tempMaxC>4</tempMaxC><tempMaxF>39</tempMaxF><tempMinC>-6</tempMinC><tempMinF>21</tempMinF><windspeedMiles>7</windspeedMiles><windspeedKmph>11</windspeedKmph><winddirection>SSW</winddirection><winddir16Point>SSW</winddir16Point><winddirDegree>200</winddirDegree><weatherCode>119</weatherCode><weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0003_white_cloud.png</weatherIconUrl><weatherDesc>Cloudy </weatherDesc><precipMM>0.7</precipMM></weather></data>
XML;
?>
I only want the temperature and weather description values. I’ve tried this code
<?php
include 'weather.php';
$xml= new SimpleXMLElement($xmlstr);
foreach ($xml->children() as $weather){
$date = $weather['date'];
$maxC = $weather['tempMaxC'];
$minC = $weather['tempMinC'];
$maxF = $weather['tempMaxF'];
$minF = $weather['tempMinF'];
$desc = $weather['weatherDesc'];
echo $date . $maxC . $minC . $maxF . $minF . $desc;
}
?>
but I just get a blank page. I really don’t know what I’m doing so would be great if someone could help. Thanks!
Cups
January 22, 2012, 9:13pm
2
Try it without the include first, add complexity in stages. Start off with the text pasted into the script, as in your question.
$xml = <<<XML
<?xml version='1.0' standalone='yes'?>
<data><request><type>Zipcode</type><query>80487
.... and so on, as you posted...
XML;
$xml= new SimpleXMLElement($xmlstr);
//Start here then comment/uncomment the dumps
var_dump($xml); // all nodes
// var_dump($xml->weather); // just the weather nodes
// var_dump($xml->weather->tempMaxC); // -4
Access the nodes using the object notation (->)
salathe
January 22, 2012, 11:20pm
3
Your XML is structured as follows:
<?xml version="1.0" standalone="yes"?>
<data>
<request>
<type>Zipcode</type>
<query>80487</query>
</request>
<current_condition>
<observation_time>10:14 AM</observation_time>
<temp_C>-2</temp_C>
<temp_F>29</temp_F>
<weatherCode>122</weatherCode>
<weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0004_black_low_cloud.png</weatherIconUrl>
<weatherDesc>Overcast </weatherDesc>
<windspeedMiles>16</windspeedMiles>
<windspeedKmph>26</windspeedKmph>
<winddirDegree>240</winddirDegree>
<winddir16Point>WSW</winddir16Point>
<precipMM>4.3</precipMM>
<humidity>81</humidity>
<visibility>16</visibility>
<pressure>1001</pressure>
<cloudcover>100</cloudcover>
</current_condition>
<weather>
<date>2012-01-22</date>
<tempMaxC>-4</tempMaxC>
<tempMaxF>24</tempMaxF>
<tempMinC>-15</tempMinC>
<tempMinF>5</tempMinF>
<windspeedMiles>21</windspeedMiles>
<windspeedKmph>35</windspeedKmph>
<winddirection>W</winddirection>
<winddir16Point>W</winddir16Point>
<winddirDegree>274</winddirDegree>
<weatherCode>323</weatherCode>
<weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0011_light_snow_showers.png</weatherIconUrl>
<weatherDesc>Patchy light snow</weatherDesc>
<precipMM>10.9</precipMM>
</weather>
<weather>
<date>2012-01-23</date>
<tempMaxC>-1</tempMaxC>
<tempMaxF>30</tempMaxF>
<tempMinC>-15</tempMinC>
<tempMinF>5</tempMinF>
<windspeedMiles>8</windspeedMiles>
<windspeedKmph>12</windspeedKmph>
<winddirection>SW</winddirection>
<winddir16Point>SW</winddir16Point>
<winddirDegree>220</winddirDegree>
<weatherCode>116</weatherCode>
<weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png</weatherIconUrl>
<weatherDesc>Partly Cloudy </weatherDesc>
<precipMM>0.8</precipMM>
</weather>
<weather>
<date>2012-01-24</date>
<tempMaxC>-1</tempMaxC>
<tempMaxF>30</tempMaxF>
<tempMinC>-14</tempMinC>
<tempMinF>6</tempMinF>
<windspeedMiles>9</windspeedMiles>
<windspeedKmph>14</windspeedKmph>
<winddirection>W</winddirection>
<winddir16Point>W</winddir16Point>
<winddirDegree>274</winddirDegree>
<weatherCode>119</weatherCode>
<weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0003_white_cloud.png</weatherIconUrl>
<weatherDesc>Cloudy </weatherDesc>
<precipMM>0.6</precipMM>
</weather>
<weather>
<date>2012-01-25</date>
<tempMaxC>1</tempMaxC>
<tempMaxF>34</tempMaxF>
<tempMinC>-15</tempMinC>
<tempMinF>6</tempMinF>
<windspeedMiles>6</windspeedMiles>
<windspeedKmph>9</windspeedKmph>
<winddirection>SSW</winddirection>
<winddir16Point>SSW</winddir16Point>
<winddirDegree>200</winddirDegree>
<weatherCode>113</weatherCode>
<weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png</weatherIconUrl>
<weatherDesc>Sunny</weatherDesc>
<precipMM>0.1</precipMM>
</weather>
<weather>
<date>2012-01-26</date>
<tempMaxC>4</tempMaxC>
<tempMaxF>39</tempMaxF>
<tempMinC>-6</tempMinC>
<tempMinF>21</tempMinF>
<windspeedMiles>7</windspeedMiles>
<windspeedKmph>11</windspeedKmph>
<winddirection>SSW</winddirection>
<winddir16Point>SSW</winddir16Point>
<winddirDegree>200</winddirDegree>
<weatherCode>119</weatherCode>
<weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0003_white_cloud.png</weatherIconUrl>
<weatherDesc>Cloudy </weatherDesc>
<precipMM>0.7</precipMM>
</weather>
</data>
If you want to get information from each of the <weather>
elements, using SimpleXML, you could do something like the following.
$data = new SimpleXMLElement($xmlstr);
foreach ($data->weather as $weather) {
$date = (string) $weather->date;
$maxC = (int) $weather->tempMaxC;
$minC = (int) $weather->tempMinC;
$maxF = (int) $weather->tempMaxF;
$minF = (int) $weather->tempMinF;
$desc = (string) $weather->weatherDesc;
// Do something useful with these values
}
See also, Basic SimpleXML usage and examples in the PHP manual.
margaux
January 23, 2012, 10:54am
4
Thanks, that worked a treat!