IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Parsage XML en choississant l'info


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut [Tableaux] Parsage XML en choississant l'info
    Bonjour,

    Comment faire en sorte pour modifier ce script et faire en sorte qu'il prenne les infos selon le <id> du flux ou bien qu'il demarre de l'item le plus ancien (en bas du flux) ?
    En effet je voudrais juste recuperer les infos du flux à la demande sans avoir la plus recente à chaque fois, mais plutot une info qui restera figé sur mon site. C'est juste pour m'eviter de retaper l'article en allant, plutot, le chercher sur le site directement.

    Merci


    RSS
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" encoding="ISO-8859-1" ?> 
      <rss version="2.0">
      <channel>
      <title>FLUX RSS</title> 
      <nb_videos>337</nb_videos> 
      <item>
      <id>392</id> 
      <date>2006-05-05</date> 
      <album>1</album> 
      <petite_description>album de videos à la mer</petite_description> 
      <longue_description>videos à la plage pres de marseille</longue_description> 
      <taille>120</taille> 
      <duree>22:53</duree> 
      <categories>16,27,29,34</categories> 
      <meilleur_thumb>14</meilleur_thumb> 
      <thumbs_promo>02,04,08,09,11,13,14,15,16</thumbs_promo> 
      <thumbs_path>http://www.site.com/4/epm/2029/1/thumbs</thumbs_path> 
      </item>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php 
     
    # Configuration 
     
    $fichier_xml = "http://www.site.com/xml/xml.php"; # Placez ici l'adresse du flux 
    $nombre_limite = 1; # Nombre maximum d'éléments à afficher 
     
     
    # Affichage du Flux 
    $file = fopen($fichier_xml,"r"); 
    if ($file) { 
    while (!feof($file)) $raw .= fread($file,32000); 
    fclose( $file ); 
     
    if(eregi("<item>(.*)</item>",$raw,$rawitems)){ 
    $items = explode("<item>", $rawitems[0]); 
    $nb = count($items); 
    $maximum = (($nb-1) < $nombre_limite) ? ($nb-1) : $nombre_limite; 
     
    for ($i=0;$i<$maximum;$i++) { 
    eregi("<longue_description>(.*)</longue_description>",$items[$i+1], $title); 
    eregi("<thumbs_path>(.*)</thumbs_path>",$items[$i+1], $link); 
    eregi("<taille>(.*)</taille>",$items[$i+1], $taille); 
    eregi("<duree>(.*)</duree>",$items[$i+1], $duree);
    echo
       "<table border=0>"
       ."<tbody>"
       ."<tr>"
       ."<td>"
       .'<a href="http://www.site.com" target=_blank><img src="'.$link[1].'/02.jpg" height="150" width="200" alt="truc" /></a>'
       ."</td>"
       ."<td>"
          #."<font size=2 color=gray>[".date("d/m/Y",strtotime($row[2]))."]</font> "
          ."<A target=_blank href=http://www.site.com>".$title[1]."</A><br>"
    	   .$row[3]
    	  ."</td>"
    	  ."</tr>"
    	  ."</tbody>"
    	  ."</table>";
     
    } 
    } 
    }
    ?>

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut
    Ton traitement réinvente la roue...
    L'api DOM XML est faite pour cela si tu es sous php 4 sinon DOM pour php5
    (get_element_by_id)

  3. #3
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    tu as un exemple pour php 4 ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut
    Jette un coup d'oeil là dessus

    DOM XML

  5. #5
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    ERREUR:
    Call to undefined function domxml_open_mem.

    Peut etre que mon hebergeur n'a pas activer dom ?

    Sinon y a t'il un moyen en reprenant mon code ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut
    la librairie dom n'existe pas chez ton hébergeur

  7. #7
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    Comment faire autrement en reprenant mon code ?

  8. #8
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Tu peux toujours utiliser le parser SAX inclu par défaut dans les php4
    http://fr3.php.net/xml

    Sinon y a t'il un moyen en reprenant mon code ?
    Une solution à l'arrache:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    //$string = 'le xml';
    $id = 392; // id qui nous intéresse
     
    $r = '~<id>'.$id.'</id>(.+?)</item>~s';
    preg_match($r, $string, $a);
     
    $r = '~<([^>]+)>(.+?)</\1>~';
    preg_match_all($r, $a[1], $a);
     
    $array = array_combine($a[1], $a[2]); // uniquement en php5
    print_r($array);
     
    print_r($a[1]); // les keys = les tags
    print_r($a[2]); // les values

  9. #9
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    ta solution m'interresse mais tu la rentre où dans le code ?

    Merci

  10. #10
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Tu mets ça où tu veux. $string serait équivalent à ton $raw.

    Mais bon, c'est une solution de secours. L'id 392 est codé en dur...

    Si vraiment tu veux récupérer tous les id et faire ton choix ensuite, tu peux faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $r = '~<id>(.+?)</id>~';
    preg_match_all($r, $string, $a);
    print_r($a[1]);

  11. #11
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    Il me renvoi l'erreur:

    "array_combine() [function.array-combine]: Both parameters should have at least 1 element"

    Il ecrit: array() array()

    Je suis vraiment débutant.


    Mon deuxieme probleme est que:
    -J'utilise un CMS (pragmamx) et je ne peux ecrire mes articles qu'en HTML. j'ajoute donc les flux RSS en inserant une iframe qui appelle le code php dans lequel je mentionne le n°ID qui m'interresse.

    <iframe framespacing='0' frameborder='no' scrolling='no' src="ID396.php" allowtransparency='true' width="100%" height="1350" name="shop"></iframe>

    Mais je suis obliger d'ecrire un fichier php par ID, y a t'il une autre solution ?

    MERCI

  12. #12
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    $string (ou $raw) contient le xml et tout ?
    Mon code fonctionne chez moi. array_combine() n'existe que pour php5. Tu arrais php5 alors ?

    Mais je suis obliger d'ecrire un fichier php par ID, y a t'il une autre solution ?
    Non, tu peux faire une fonction qui prend en paramètre l'id et qui retourne les info que tu veux.

    Testes mon code dans un fichier vierge avec le strict minimum pour voir ce qui cloche

  13. #13
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    J'ai php5 en local mais php4 sur mon hebergeur.

    j'ai mis ton code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php 
    $string = 'http://www.clubic.com/xml/news.xml';
    $id = 392; // id qui nous intéresse
     
    $r = '~<id>'.$id.'</id>(.+?)</item>~s';
    preg_match($r, $string, $a);
     
    $r = '~<([^>]+)>(.+?)</\1>~';
    preg_match_all($r, $a[1], $a);
     
    //$array = array_combine($a[1], $a[2]); // uniquement en php5
    print_r($array);
     
    print_r($a[1]); // les keys = les tags
    print_r($a[2]); // les values
    ?>
    Mais meme erreur.

    comment integrer la fonction qui prend en paramètre l'id et qui retourne les info que tu veux ?

    Merci beaucoup

  14. #14
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Ok, le $string c'est le $raw de ton code initial, donc faut mettre avant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $fichier_xml = 'http://www.clubic.com/xml/news.xml';
    $file = fopen($fichier_xml,"r"); 
    $string = '';
    if ($file) { 
      while (!feof($file)) $string .= fread($file,32000); 
      fclose( $file );
    Du coup, enlève le $string = 'http://www.clubic.com/xml/news.xml';

  15. #15
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    il m'affiche: Array ( ) Array ( ) avec le flux xml de clubic.

    et avec un autre flux:

    Array ( [0] => date [1] => scene [2] => petite_description [3] => longue_description [4] => taille [5] => duree [6] => categories [7] => meilleur_thumb [8] => thumbs_promo [9] => thumbs_path ) Array ( [0] => 2006-05-11 [1] => 2 [2] => videos plages [3] => Dans cette vidéo, vous verrez la plage de copacabana [4] => 224 [5] => 21:20 [6] => 17,25,29,34,40 [7] => 15 [8] => 02,06,07,08,13,14,15,18,20 [9] => http://images.ma.com/4/epm/2029/2/thumbs )

    Comment exploiter ce second flux et integrer la fonction qui prend en paramètre l'id et qui retourne les info que tu veux ?

    Merci

  16. #16
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    En fait, dans ton premier post, le xml que tu as copié collé contient des <id></id> pour chaque item. Mais il n'y en a pas dans le xml de clubic. C'est facheux ; )

    Voilà un code qui fonctionne chez moi. On peut soit choper l'item par id ou par position. Ca ne dépend pas d'une librairie xml (SAX, DOM etc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    // Retourne un array avec les clés = les tags
    // et les values = les données des tags d'un <item>
    // L'item est repéré par son id
    function getItemById($id, $xmlstr) {
      $r = '~<id>'.$id.'</id>(.+?)</item>~s';
      if (preg_match($r, $xmlstr, $ar))
        return parseItem($ar[1]);
      return array();
    }
     
    // Retourne un array avec les clés = les tags
    // et les values = les données des tags d'un <item>
    // L'item est repéré par sa position de haut en bas
    // 1er item: 1, 2iem 2 etc
    function getItemByPos($pos, $xmlstr) {
      $r = '~(?:<item>.+?</item>\s*){'.($pos-1).'}\s*<item>(.+?)</item>~s';
      if (preg_match($r, $xmlstr, $ar))
        return parseItem($ar[1]);
      return array();
    }  
     
    // Fonction utilisée par les 2 premières
    function parseItem($str) {
      $array = array();
      $r = '~<([^>]+)>(.+?)</\1>~';
      if (preg_match_all($r, $str, $ar)) {
        //uniquement en php5
        //$array = array_combine($ar[1], $ar[2]);
        for ($i = 0, $e = count($ar[1]); $i < $e; ++$i) {
          $array[$ar[1][$i]] = $ar[2][$i];
        }
      }
      return $array;
    }
     
    // Retourne une chaine xml téléchargée
    function getXML($url) {
      $str = '';
      if (($f = fopen($url, 'r')) !== FALSE) {
        while (!feof($f)) $str .= fread($f, 4096); 
        fclose($f);
      }
      return $str;
    } 
     
    // Code de test. On chope le 3ième item de clubic
    $xml = 'http://www.clubic.com/xml/news.xml';
    $xmlstr = getXML($xml);
    print_r(getItemByPos(3, $xmlstr));
     
    // Pour un autre flux qui à des <id>
    // $xml = '...';
    // $xmlstr = getXML($xml);
    // print_r(getItemById(7, $xmlstr));

  17. #17
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    Ce qui est super c'est qu'il me retourne toutes les infos par Id, donc j'ai déja un premier tri. Mais maintenant comment exploiter le code que tu m'a donné ?

    La problematique:
    J'utilise un CMS dans lequel j'ecris des articles en html. Pour chaque article html je voudrais afficher des infos du flux par ID (description, duree,...).

    Pour l'instant ma seule solution et d'appeler un fichier php qui parse le Flux XML à l'aide d'une iframe que je colle dans le html -> Le probleme est qu'il faut creer un fichier php different par ID pour chaque article (ce n'est pas possible car je vais publier une centaine d'articles).

    Je te remercie beaucoup du temps que tu me consacres car je suis perdu.

  18. #18
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Met mon code dans un unique fichier, disons item.php
    Ensuite, le src de ton iframe sera (selon l'id) :
    src="item.php?id=396"

    Dans item.php, tu aurais, en plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $xml = 'http://....';
    $xmlstr = getXML($xml);
    $res = getItemById($_GET['id'], $xmlstr);
     
    if (count($res)) {
      // ok, on a les infos
      echo $res['date'] . $res['petite_description'];
      // etc
    }
    else {
      echo 'y a eu un prob ; )';
    }

  19. #19
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 138
    Par défaut
    Super. MERCI Beaucoup

    Je gagne un temps très precieux grace à toi.

    Derniere petite chose, j'ai vu su Clubic un morceau de code pour integrer MagiepieRSS qui permet de copier le flux en cache pour eviter de le charger sur du serveur à chaque fois (sinon je copie le flux sur le serveur en faisant un cron ?):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php 
    require_once "magpierss/rss_fetch.inc"; \/\/ Chemin pour accéder au fichier rss_fetch.inc 
    $fichier_xml = "http://www.site.com/xml/news.xml";
     
    $rss = fetch_rss($fichier_xml); 
     
    echo $rss->channel['title'],"<br />\n"; 
    foreach ($rss->items as $item ) { 
    $title = $item[title]; 
    $url = $item[link]; 
    echo "<a href=\"$url\">Array</a><br />\n"; 
    } 
    ?>
    Est il possible de l'integrer dans le code ou mieux vaut une autre solution ?

    En tout cas merci pour tout

Discussions similaires

  1. [Tableaux] Bouton radio : récupération de l'info
    Par CROSS dans le forum Langage
    Réponses: 9
    Dernier message: 27/06/2007, 18h59
  2. [Tableaux] Sujet de l'exam d'info
    Par Mydriaze dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2007, 13h19
  3. [AJAX] Parsage XML ne fonctionne pas sous IE!
    Par webrider dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/03/2007, 19h50
  4. [XML] [XML-RPC] retrouver les infos d'une réponse serveur
    Par arnolem dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/08/2006, 12h07
  5. [DOM] Parsage XML en PHP 4
    Par Huntress dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 07/12/2005, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo