Problème avec SimpleXML

Problème avec SimpleXML - PHP - Programmation

Marsh Posté le 05-10-2010 à 22:28:10    

Bonjour à tous  :hello:  :hello:  
 
J'ai un souci avec SimpleXML.
 
Voici mon flux XML :  
 

Code :
  1. <rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  2. <channel>
  3.  <title>Yahoo! Weather - Ho Chi Minh City, VM</title>
  4.  <link>http://us.rd.yahoo.com/dailynews/rss/weather/Ho_Chi_Minh_City__VM/*http://weather.yahoo.com/forecast/VMXX0007_c.html</link>
  5.  <description>Yahoo! Weather for Ho Chi Minh City, VM</description>
  6.  <language>en-us</language>
  7.  <lastBuildDate>Tue, 05 Oct 2010 10:30 pm ICT</lastBuildDate>
  8.  <ttl>60</ttl>
  9.  <yweather:location city="Ho Chi Minh City" region=""   country="VM"/>
  10.  <yweather:units temperature="C" distance="km" pressure="mb" speed="km/h"/>
  11.  <yweather:wind chill="24"   direction="0"   speed="1.61" />
  12.  <yweather:atmosphere humidity="100"  visibility="6"  pressure="982.05"  rising="2" />
  13.  <yweather:astronomy sunrise="5:42 am"   sunset="5:41 pm"/>
  14.  
  15.  <image>
  16.   <title>Yahoo! Weather</title>
  17.   <width>142</width>
  18.   <height>18</height>
  19.   <link>http://weather.yahoo.com</link>
  20.   <url>http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif</url>
  21.  </image>
  22.  <item>
  23.   <title>Conditions for Ho Chi Minh City, VM at 10:30 pm ICT</title>
  24.   <geo:lat>10.82</geo:lat>
  25.   <geo:long>106.67</geo:long>
  26.   <link>http://us.rd.yahoo.com/dailynews/rss/weather/Ho_Chi_Minh_City__VM/*http://weather.yahoo.com/forecast/VMXX0007_c.html</link>
  27.   <pubDate>Tue, 05 Oct 2010 10:30 pm ICT</pubDate>
  28.   <yweather:condition  text="Light Rain"  code="11"  temp="24"  date="Tue, 05 Oct 2010 10:30 pm ICT" />
  29.    
  30.   <description>
  31.    <![CDATA[
  32.    <img src="http://l.yimg.com/a/i/us/we/52/11.gif"/><br />
  33.    <b>Current Conditions:</b><br />
  34.    Light Rain, 24 C<BR />
  35.    <BR /><b>Forecast:</b><BR />
  36.    Tue - Scattered Thunderstorms. High: 31 Low: 23<br />
  37.    Wed - Scattered Thunderstorms. High: 31 Low: 23<br />
  38.    <br />
  39.    <a href="http://us.rd.yahoo.com/dailynews/rss/weather/Ho_Chi_Minh_City__VM/*http://weather.yahoo.com/forecast/VMXX0007_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
  40.    (provided by <a href="http://www.weather.com" >The Weather Channel</a> )<br/>
  41.    ]]>
  42.   </description>
  43.    
  44.   <yweather:forecast day="Tue" date="5 Oct 2010" low="23" high="31" text="Scattered Thunderstorms" code="47" />
  45.   <yweather:forecast day="Wed" date="6 Oct 2010" low="23" high="31" text="Scattered Thunderstorms" code="38" />
  46.   <guid isPermaLink="false">VMXX0007_2010_10_05_22_30_ICT</guid>
  47.  </item>
  48. </channel>
  49. </rss>


 
Mon souci vient des "<yweather:"  
Je n'arrive pas à les lire, je veux accéder par exemple à celui ci : <yweather:location city
Je fais donc un  

Code :
  1. echo $simpleXml->channel->yweather:location->city;


 
Et ça me sort évidemment un "Parse error: syntax error, unexpected ':'"
 
Le problème vient du "deux points", quand j'essaye d'afficher les autres éléments j'ai aucun souci.
 
Voilà si vous pouviez m'aider ce serait génial  :love:  :jap:  
 :hello:  


---------------
Ils ne sont grands que parce que nous sommes à genoux. - Topic Kingdom
Reply

Marsh Posté le 05-10-2010 à 22:28:10   

Reply

Marsh Posté le 06-10-2010 à 15:17:18    

salut,
 
il faut pas entourer yweather:location par des crochets? (cf http://www.php.net/manual/fr/simpl [...] -basic.php exemple #3)
 
++

Reply

Marsh Posté le 06-10-2010 à 15:45:18    

Quand je mets entre accolades (cf l'exemple 3), ça ne me fait pas d'erreurs, mais je n'arrive pas pour autant à récupérer le contenu de l'attribut city :
 

Code :
  1. $test = $simpleXml->channel->{'yweather:location'};
  2. echo $test['city'];


 
ne renvoie rien :/


---------------
Ils ne sont grands que parce que nous sommes à genoux. - Topic Kingdom
Reply

Marsh Posté le 06-10-2010 à 15:45:30    

Apparemment, les namespaces xml compliquent beaucoup SimpleXML ...
http://devzone.zend.com/article/688

 

Sinon, tu devrais pouvoir le faire avec un xpath

Code :
  1. $test=$simpleXml->xpath('/rss/channel/yweather:location');
  2. echo $test[0]['city'];


Message édité par Paulp le 06-10-2010 à 15:47:57
Reply

Marsh Posté le 06-10-2010 à 16:05:46    

Ah yes merci beaucoup c'est quand même plus simple, mais c'est peut être plus lourd en terme de perf ?


---------------
Ils ne sont grands que parce que nous sommes à genoux. - Topic Kingdom
Reply

Marsh Posté le 06-10-2010 à 16:59:37    

Ah par contre nouveau souci, à la fin de mon XML j'ai ces 2 lignes :
 

Code :
  1. <yweather:forecast day="Tue" date="5 Oct 2010" low="23" high="31" text="Scattered Thunderstorms" code="47" />
  2. <yweather:forecast day="Wed" date="6 Oct 2010" low="23" high="31" text="Scattered Thunderstorms" code="38" />


 
Qui ont le même nom donc.
 
J'ai essayé ça mais ça ne marche pas :  
 

Code :
  1. $forecast = $simpleXml->xpath('/rss/channel/yweather:forecast');
  2. $forecast_today_day = $forecast[0]['day'];
  3. $forecast_today_low = $forecast[0]['low'];
  4. $forecast_today_high = $forecast[0]['high'];
  5. $forecast_today_text = $forecast[0]['text'];
  6. $forecast_today_code = $forecast[0]['code'];
  7. $forecast_tomorrow_day = $forecast[1]['day'];
  8. $forecast_tomorrow_low = $forecast[1]['low'];
  9. $forecast_tomorrow_high = $forecast[1]['high'];
  10. $forecast_tomorrow_text = $forecast[1]['text'];
  11. $forecast_tomorrow_code = $forecast[1]['code'];


---------------
Ils ne sont grands que parce que nous sommes à genoux. - Topic Kingdom
Reply

Marsh Posté le 06-10-2010 à 17:03:15    

Reply

Marsh Posté le 06-10-2010 à 17:10:21    


Tu réponds à mon premier post ou à mon dernier ? :D
Si c'est le dernier, je vois pas comment ça résout mon souci [:tinostar]


---------------
Ils ne sont grands que parce que nous sommes à genoux. - Topic Kingdom
Reply

Marsh Posté le 06-10-2010 à 17:32:03    

tes noeuds yweather:forecast sont dans un noeud item

Reply

Marsh Posté le 06-10-2010 à 17:41:53    

Merci ! Faute débile d'étourderie :jap:


---------------
Ils ne sont grands que parce que nous sommes à genoux. - Topic Kingdom
Reply

Marsh Posté le 06-10-2010 à 17:41:53   

Reply

Marsh Posté le 06-10-2010 à 18:37:12    

Alekusu2 a écrit :


Tu réponds à mon premier post ou à mon dernier ? :D
Si c'est le dernier, je vois pas comment ça résout mon souci [:tinostar]


 
au dernier, pour pouvoir utiliser les namespaces dans un xpath il faut les enregistrer

Reply

Marsh Posté le 06-10-2010 à 18:49:47    

stealth35 a écrit :


 
au dernier, pour pouvoir utiliser les namespaces dans un xpath il faut les enregistrer


Bah non...la preuve c'est que je le fais sans les enregistrer et que ça marche :D


---------------
Ils ne sont grands que parce que nous sommes à genoux. - Topic Kingdom
Reply

Marsh Posté le 06-10-2010 à 18:54:02    

Alekusu2 a écrit :


Bah non...la preuve c'est que je le fais sans les enregistrer et que ça marche :D


Alekusu2 a écrit :


J'ai essayé ça mais ça ne marche pas :  

 

faudrait savoir...


Message édité par stealth35 le 06-10-2010 à 18:54:23
Reply

Marsh Posté le 06-10-2010 à 19:37:27    

Le problème est expliqué par paulp, j'ai oublié un noeud dans l'adresse du xpath


---------------
Ils ne sont grands que parce que nous sommes à genoux. - Topic Kingdom
Reply

Marsh Posté le 07-10-2010 à 11:08:02    

Mon premier lien explique qu'en effet, il faut enregistrer le namespace pour manipuler ensuite les noeuds avec la méthode children (ce qui est assez lourd, SimpleXML perd tout son interet).
En revanche, le xpath accepte les namespaces.
On peut néanmoins les enregistrer pour pour les abréger par exemple ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed