Extracting some fields from an xml file

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!

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 (->)

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.

Thanks, that worked a treat!