Flux meteo xml

Eléphanteau du PHP | 24 Messages

23 oct. 2007, 18:35

Bonjour,
j'essaye de recuperer les infos meteo de la page xml suivante (pour les mettres dans une table=
http://xoap.weather.com/weather/local/F ... f76734eadf

et j'arrive bien a récuperer les infos pour le jour encours, mais pas
correctement pour le forecast ( <dayf>):

Code : Tout sélectionner

<dayf> <lsup>10/22/07 3:19 PM Local Time</lsup> - <day d="0" t="Monday" dt="Oct 22"> <hi>N/A</hi> <low>-1</low> <sunr>8:02 AM</sunr> <suns>6:41 PM</suns> - <part p="d"> <icon>44</icon> <t>N/A</t> - <wind> <s>N/A</s> <gust>N/A</gust> <d>N/A</d> <t>N/A</t> </wind> <bt>N/A</bt> <ppcp>0</ppcp> <hmid>N/A</hmid> </part> - <part p="n"> <icon>31</icon> <t>Clear</t> - <wind> <s>8</s> <gust>N/A</gust> <d>360</d> <t>N</t> </wind> <bt>Clear</bt> <ppcp>0</ppcp> <hmid>76</hmid> </part> </day> + <day d="1" t="Tuesday" dt="Oct 23"> ..... </day> ... -<dayf> f mon code: $parser = xml_parser_create( ); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parse_into_struct($parser,$xml,$values,$index); xml_parser_free($parser); $city = htmlspecialchars($values[$index['dnam'][0]]['value']); $unit_temp = $values[$index['ut'][0]]['value']; $unit_speed = $values[$index['us'][0]]['value'];
je n'arrive pas appeler correctement le tableau contenant les <day> de 1
à 9 ...

faut-il les parser a nouveau? ou differement?

Merci pour vos lumieres!
A+
VooDoo

Mammouth du PHP | 2937 Messages

23 oct. 2007, 18:42

Connais-tu SimpleXML ? :wink:

Eléphanteau du PHP | 24 Messages

23 oct. 2007, 20:00

non je connais pas, le xml non plus d'ailleurs ;)
j'ai regardé rapidement et je vois pas trop la facilité... mais je vais voir plus en details mm si je suis pas trop inspiré..
Merci à toi!
++
VooDoo

Invité
Invité n'ayant pas de compte PHPfrance

24 oct. 2007, 09:48

j'essaye ca mais c'est pas mieux...

Code : Tout sélectionner

$xml = simplexml_load_file($forecast_url) ; foreach($xml->dayf as $exemple) { //print_r($exemple) ; var_dump($exemple[0]['d']); }
comment sont construit les tableaux? comment les appelés??? :oops:

Eléphant du PHP | 443 Messages

24 oct. 2007, 10:02

<d> est un noeud pas un attribut, donc essaie:
$xml = simplexml_load_file($forecast_url) ;

foreach($xml->dayf as $exemple)
{
//print_r($exemple) ;
var_dump($exemple->d);
}

Tracker.

Eléphanteau du PHP | 24 Messages

24 oct. 2007, 10:47

merci pour ton aide, mais je lui mettes $exemple->d ou $exemple->d il me renvoi toujours:
object(SimpleXMLElement)#6 (0) { }

j'en fait quoi de ca???
comment recuperer les autres infos icon genre:
- <part p="n">
<icon>11</icon>
<t>Showers</t>
ou
<wind>
<bt>
<ppcp>
..

comment faire la distinction entre noeuds et attributs, et comment les recuperer?

Mammouth du PHP | 2937 Messages

24 oct. 2007, 11:16

Dans <part p="n"></part>, PART est un nœud, p un attribut et n la valeur de l'attribut.

Essaie un echo au lieu d'un print_r() pour voir ce que ça donne.
$xml = simplexml_load_file ($forecast_url) ; 

foreach ($xml -> dayf as $exemple) 
{ 
  foreach ($exemple -> part as $valeur)
  {
    echo htmlspecialchars ((string) $valeur -> icon);
    echo htmlspecialchars ((string) $valeur -> t);
  }
}
Ça devrait être plus clair.

Eléphanteau du PHP | 24 Messages

24 oct. 2007, 11:48

bah pas vraiment, ca n'affiche rien :(

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

24 oct. 2007, 13:06

Ton exemple de départ est mal formatté, ça rend sa lecture difficile et sans le chemin exact vers les données que l'on cherche il est pratiquement impossible de naviguer un arbre XML.

Je suis allé regarder sur le site original pour récupérer la structure exacte de l'arbre, voici un exemple qui affiche les deux <part> de chaque <day> avec d de 1 à 9. À toi de modifier selon tes besoins, tout est là.
echo "<pre>\n";

$weather = simplexml_load_file('http://xoap.weather.com/weather/local/FRXX0153?cc=*&dayf=10&prod=xoap&unit=m&par=1050532020&key=133aa3f76734eadf');

$city = htmlspecialchars($weather->loc->dnam); 
$unit_temp = $weather->head->ut; 
$unit_speed = $weather->head->us;


foreach ($weather->dayf->day as $day)
{
	if ($day['d'] < 1 || $day['d'] > 9)
	{
		// On saute les jours avec "d" inférieur à 1 ou supérieur à 9
		continue;
	}

	foreach ($day->part as $part)
	{
		if ($part['p'] == 'd')
		{
			echo "Matin\n";
		}
		else
		{
			echo "Soir\n";
		}

		echo 'Icon: ', $part->icon, "\n";
	}
}

Eléphanteau du PHP | 24 Messages

24 oct. 2007, 16:14

Yep!
Carrement bien ton code! C'est beaucoup plus clair maintenant!!!
Merci à toi, je vais essayer de tout recuperer je ferais signe si je bloques encore...
Encore merci à tous!
A+
VooDoo