Page 1 sur 1

Flux meteo xml

Posté : 23 oct. 2007, 18:35
par voodoonet
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

Posté : 23 oct. 2007, 18:42
par Victor BRITO
Connais-tu SimpleXML ? :wink:

Posté : 23 oct. 2007, 20:00
par voodoonet
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

Posté : 24 oct. 2007, 09:48
par Invité
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:

Posté : 24 oct. 2007, 10:02
par Tracker
<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.

Posté : 24 oct. 2007, 10:47
par voodoonet
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?

Posté : 24 oct. 2007, 11:16
par Victor BRITO
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.

Posté : 24 oct. 2007, 11:48
par voodoonet
bah pas vraiment, ca n'affiche rien :(

Posté : 24 oct. 2007, 13:06
par Hubert Roksor
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";
	}
}

Posté : 24 oct. 2007, 16:14
par voodoonet
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