PHP et XML + xpath : demande de précisions

PHP et XML + xpath : demande de précisions - PHP - Programmation

Marsh Posté le 14-10-2008 à 09:17:00    

Bonjour à tous, mes amis ! [:black_lord]  
 
 
Pour réaliser un "tri" dans un code XML, on peut utiliser la méthode xpath :
 

Code :
  1. <?php
  2. $string = <<<XML
  3. <a>
  4. <b>
  5.   <c>text</c>
  6.   <c>stuff</c>
  7. </b>
  8. <d>
  9.   <c>code</c>
  10. </d>
  11. </a>
  12. XML;
  13. $xml = new SimpleXMLElement($string);
  14. /* On cherche <a><b><c> */
  15. $result = $xml->xpath('/a/b/c');
  16. while(list( , $node) = each($result)) {
  17.     echo '/a/b/c: ',$node,"\n";
  18. }
  19. /* Les chemins relatifs fonctionnent aussi... */
  20. $result = $xml->xpath('b/c');
  21. while(list( , $node) = each($result)) {
  22.     echo 'b/c: ',$node,"\n";
  23. }
  24. ?>


 
J'aimerais, dans ce code, au lieu de mettre directement la portion de code XML, qu'on l'a récupère à partir d'un fichier distant (URL). J'ai essayé un $string = fopen ("http://www.domaine.com/fichier.xml" ); mais rien de bien de convaincant. :/
 
Quelqu'un peut-il m'éclairer ? [:transparency]  
 
 
Merci.


Message édité par zoukoufxxx le 14-10-2008 à 14:46:21

---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 09:17:00   

Reply

Marsh Posté le 14-10-2008 à 14:08:15    

Ca n'a strictement aucun rapport avec XML ou XPath, c'est uniquement une question de PHP [:petrus75]
 
et la réponse est... dans la doc PHP
http://fr2.php.net/manual/en/function.fopen.php
http://fr2.php.net/manual/en/function.fread.php
http://fr2.php.net/manual/en/function.fclose.php


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 14-10-2008 à 14:49:45    

Merci maître. [:mr couleur]  
 
 
J'ai tenté ça :

Code :
  1. <?php
  2. $filename = "http://www.carbeo.com/rss/moy_dpt.xml";
  3. $handle = fopen($filename, "r" );
  4. $contents = fread($handle, filesize($filename));
  5. /* On cherche <item><title> */
  6. $result = $contents->xpath('item/title');
  7. while(list( , $node) = each($result)) {
  8.     echo 'item et title : ',$node,"\n";
  9. }
  10. fclose($handle);
  11. ?>


 
Mais :
Warning: filesize() [function.filesize]: stat failed for http://www.carbeo.com/rss/moy_dpt.xml in /home/users/t/tomtom/www/test/index.php on line 4
 
Warning: fread() [function.fread]: Length parameter must be greater than 0 in /home/users/t/tomtom/www/test/index.php on line 4
 
Fatal error: Call to a member function xpath() on a non-object in /home/users/t/tomtom/www/test/index.php on line 8
 
 [:sumo]  
 


Message édité par zoukoufxxx le 14-10-2008 à 14:50:15

---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 14:50:34    

masklinn a écrit :

Ca n'a strictement aucun rapport avec XML ou XPath, c'est uniquement une question de PHP [:petrus75]
 
et la réponse est... dans la doc PHP
http://fr2.php.net/manual/en/function.fopen.php
http://fr2.php.net/manual/en/function.fread.php
http://fr2.php.net/manual/en/function.fclose.php


 :non:  
http://fr.php.net/simplexml_load_file
 
@zoukoufxxx
 [:rtfm]

Message cité 1 fois
Message édité par dwogsi le 14-10-2008 à 14:52:09

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 14:55:29    


J'avais déjà testé, ça marchait pas [:cerveau zytrasnif]
 
EDIT : ça fait une après-midi et une matinée que je suis dessus [:haha_auto]


Message édité par zoukoufxxx le 14-10-2008 à 14:56:29

---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 14:57:21    

ça marche pas? c'est à dire?
Et la config de php permet-elle d'ouvrir des URL distantes?


Message édité par dwogsi le 14-10-2008 à 14:57:44

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 15:00:27    

Un phpinfo () te renseignerai ?


---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 15:19:19    

En gros c'est ça qui t'intéresse :
http://www.manuelphp.com/php/ini.allow-url-fopen.php
Sinon je crois que phpinfo() donne cette info si mes souvenirs sont exactes.
Et qu'est ce que simplexml_load_file() te sort?????????????????


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 15:23:25    

phpinfo me sort : allow_url_fopen : On
Donc ça semble OK. :)


---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 15:24:02    

Mais bordel... :o :o :o :o
Et qu'est ce que simplexml_load_file() te sort?????????????????


Message édité par dwogsi le 14-10-2008 à 15:24:20

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 15:24:02   

Reply

Marsh Posté le 14-10-2008 à 15:25:04    

Pour simplexml_load_file(), tu le mettrais comme ça ? :
 

Code :
  1. <?php
  2. $contents = simplexml_load_file("http://www.carbeo.com/rss/moy_dpt.xml" );
  3. /* On cherche <item><title> */
  4. $result = $contents->xpath('item/title');
  5. while(list( , $node) = each($result)) {
  6.     echo 'item et title : ',$node,"\n";
  7. }
  8. fclose($handle);
  9. ?>


 
 [:hiddensmile]


Message édité par zoukoufxxx le 14-10-2008 à 15:25:28

---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 15:28:43    

Le fclose() a rien à foutre là.
 
Je mettrais quelque chose comme ça (pas testé) :

Code :
  1. <?php
  2. $contents = simplexml_load_file("http://www.carbeo.com/rss/moy_dpt.xml" );
  3. /* On cherche <item><title> */
  4. $result = $contents->xpath('item/title');
  5. foreach($result as $node) {
  6.     // $node est de type SimpleXMLElement, pas sûr que ça fonctionne bien
  7.     echo 'item et title : ',$node->title,"\n";
  8. }
  9. ?>


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 15:33:36    

dwogsi a écrit :

Le fclose() a rien à foutre là.


Je l'avais oublié. [:chepakoi]  
 
 

dwogsi a écrit :


Code :
  1. <?php
  2. $contents = simplexml_load_file("http://www.carbeo.com/rss/moy_dpt.xml" );
  3. /* On cherche <item><title> */
  4. $result = $contents->xpath('item/title');
  5. foreach($result as $node) {
  6.     // $node est de type SimpleXMLElement, pas sûr que ça fonctionne bien
  7.     echo 'item et title : ',$node->title,"\n";
  8. }
  9. ?>



Merci beaucoup. :jap:
J'ai testé et ça m'affiche rien. :/
 


---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 15:37:43    

Ouai non mais laisse tomber le code que j'ai donné.
Tu cherches à faire quoi exactement?
 
Pour lister tous les titre de toute les channels ya qu'a faire :

Code :
  1. <?php
  2. $xml = simplexml_load_file("http://www.carbeo.com/rss/moy_dpt.xml" );
  3. foreach($xml->channel as $channel)
  4.     foreach($channel->item as $item) {
  5.         echo 'Titre : ',$item->title,"<br />";
  6.     }
  7. ?>


Fonctionne.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 15:41:05    

Ou pour faire même plus complet :

Code :
  1. <?php
  2. $xml = simplexml_load_file("http://www.carbeo.com/rss/moy_dpt.xml" );
  3. foreach($xml->channel as $channel)
  4. {
  5.     echo '<h1>',$channel->title,'</h1><ul>';
  6.     foreach($channel->item as $item) {
  7.         echo '<li><a href="',$item->link,'">',$item->title,'</a></li>';
  8.     }
  9.     echo '</ul>';
  10. }
  11. ?>


Non?


Message édité par dwogsi le 14-10-2008 à 15:45:45

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 15:42:45    

Tu es un dieu [:cerveau lent]  
Ca fonctionne effectivement !
Un grand merci ! [:haha jap]


---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 15:51:28    

Le listage/filtrage des données fonctionne très bien.
Ce que je voudrais faire concrètement, c'est afficher les prix des carburants d'un département spécifique.
Comment faire ? [:le nivea sun de dm]  
Je suppose qu'il faut user de if (title = "Haute-Loire" ) { alors afficher les prix des carburants en Haute Loire ; } ?


---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 15:58:32    

Tu supposes bien. Mais essais quelque chose au moins !
C'est par l'Armée du Salut ici !

 

Bon allez, un petit exemple quand même :

Code :
  1. <?php
  2. // Uniquement pour l'ain par exemple :
  3. $dep = '01';
  4.  
  5. $xml = simplexml_load_file("http://www.carbeo.com/rss/moy_dpt.xml" );
  6. foreach($xml->channel as $channel)
  7. {
  8.     foreach($channel->item as $item) {
  9.         if( substr($item->title,0,2) == $dep )
  10.         {
  11.             echo $item->title,' : ',$item->description,'<br />';
  12.         }
  13.     }
  14. }
  15. ?>
 

Là tu aura tous les tarifs des carburants proposés dans l'ain.
Suffit ensuite de changer le numéro de département pour "aller voir ailleur".
Tu devrais aussi penser à copier localement le fichier et ne le télécharger que de temps en temps. Ca évite d'avoir trop de requêtes externes.

 

Edit : Et puis penser à stopper les boucles aussi quand tu as trouvé ce que tu cherchais (break).


Message édité par dwogsi le 14-10-2008 à 16:15:02

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 16:05:36    

Un énorme merci à toi ! Je n'y serais point arriver tout seul, c'est vraiment sympa. [:cerveau discobeck]  
 
J'ai vraiment du mal avec le PHP. J'arrive à lire et comprendre le code, mais j'ai toujours du mal à le pondre. :sweat:  


---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le 14-10-2008 à 16:07:39    

Parce que t'as jamais essayé de commencer par les bases. :)
Et ne viens pas dire le contraire!


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 14-10-2008 à 18:46:46    

Si si, j'avais les bases mais les ai perdu. [:hiddensmile]  
Et là c'était assez urgent (car boulot), mais ça m'a pas empêcher de chercher par moi-même avant de venir requir votre aide. :jap:


---------------
Le site des BD d'HFR | Aurélien Amacker : Arnaque ? - Mongolien du Web
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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