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 :

Parser un flux xml (chaîne)


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Parser un flux xml (chaîne)
    Bonjour,

    Je cherche de la doc ou un exemple pour parser un flux xml, une chaîne pas un fichier. (J'ai trouvé pour un fichier mais ce n'est pas ce qu'il me faut).

    J'ai fait une recherche ici avant de poster mais j'obtiens 50 pages de résultat...

    Merci d'avance.

    Ariane

  2. #2
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Tu veux parser sur quoi, sur des SET (courant ...)

    Si c le cas alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php 
    $xml = simplexml_load_file('test.xml'); 
    $liste = $xml->Set; 
    foreach ($liste as $info){ 
       print $info->Titre; 
       print $info->.... 
       etc ...
    } 
    ?>
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Désolée je sais pas ce qu'est un set.
    Je n'ai pas de fichier, pas de test.xml ou autre. J'ai une fonction qui me renvoie un flux xml, voici un petit extrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?xml version="1.0" encoding="UTF-8" ?> <allopass> <bracket>  <id_palier>11</id_palier>  <type>audio</type>  <country>AT</country>  <numtel>0900 540320</numtel>  <price>3.63</price>  <currency>EUR</currency> </bracket> <bracket>  <id_palier>15</id_palier>  <type>audio</type>  <country>BE</country>  <numtel>0903 51 959</numtel>  <price>2.50</price>  <currency>EUR</currency> </bracket>
    ...
    </allopass>
    Et j'ai besoin de le parser pour extraire les données qui m'intéressent.
    Merci.
    Dernière modification par Thes32 ; 20/01/2010 à 13h17. Motif: Balise CODE

  4. #4
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Désolé , je suis partis sur un fichier xml, je sais pas pourquoi !!!!!

    Je regarde pour le flux ...

    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  5. #5
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Dans ton flux, (plutôt sous cette forme: http://www.site.com/flux.xml),

    Tu veux lire plusieurs item ici: <bracket> pour les champs suivants:
    De <id_palier> à <currency> ?
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oui tous les brackets contiennent un "country" et je vais chercher les infos liées à un certain country p.ex. FR ou BE.
    Et il y a souvent 2 brackets contenant le même country.

  7. #7
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Si c le cas, et je pense que OUI,

    Tu fait l'appel de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Lecture du FLUX XML sur le serveur
    $xml = lit_xml("http://www.site.com/flux.xml","bracket",array("id_palier", "type", ...,"price", "currency"));
    En utilisant la fonction suivante:
    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
     
    // Cette fonction sert de parseur
    function lit_xml($fichier,$item,$champs) {
       // on lit le fichier
       if($chaine = @implode("",@file($fichier))) {
          // on explode sur <item>
          // Dans l'exemple il s'agit de 'bracket'
          $tmp = preg_split("/<\/?".$item.">/",$chaine);
          // pour chaque <item> donc tous les bracket
          for($i=1;$i<sizeof($tmp)-1;$i+=2)
             // on lit les champs demandés <champ> donc il s'agit de 'id' et 'type' ...
             foreach($champs as $champ) {
                $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
                // on ajoute l'élément au tableau
                $tmp3[$i-1][] = @$tmp2[1];
             }
          // et on retourne le tableau dans la fonction
          return $tmp3;
       }
    }
    Puis pour lire toutes les infos de chaque item <bracket>
    tu utilise un foreach tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    foreach($xml as $row) {
     
      echo $row[0];
      // affiche 11
      echo $row[1];
      // affiche audio
      ......
     
     
      }
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci !
    Mais dans la première partie du code, je vois un fichier, donc je ne comprends pas, ça sert à transformer la chaîne en fichier ?

  9. #9
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Ok

    Dans ce cas tu lances:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $xml = lit_xml("http://www.site.com/flux.xml","bracket",array("country"));
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  10. #10
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Dans le cas d'un chaîne (pardon encore), tu enlèves:
    par juste $fichier (même si le nom ne veux plus dire fichier)
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  11. #11
    Invité
    Invité(e)
    Par défaut
    Donc la première partie serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xml = lit_xml($maChaineXML,"bracket",array("country"));
    ?

    Si oui, alors je vais essayer, merci.
    Dernière modification par Thes32 ; 20/01/2010 à 14h14. Motif: Balise CODE

  12. #12
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Celà me semble correct !
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  13. #13
    Invité
    Invité(e)
    Par défaut
    Salut,

    J'ai donc ajouté tout le code dans mon fichier php, ce qui donne :

    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
    // Cette fonction sert de parseur
    function lit_xml($fichier,$item,$champs) {
       // on lit le flux xml
       if($chaine = @implode("",$fichier)) {
          // on explode sur <item>
          // Dans l'exemple il s'agit de 'bracket'
          $tmp = preg_split("/<\/?".$item.">/",$chaine);
          // pour chaque <item> donc tous les bracket
          for($i=1;$i<sizeof($tmp)-1;$i+=2)
             // on lit les champs demandés <champ> donc il s'agit de 'id' et 'type' ...
             foreach($champs as $champ) {
                $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
                // on ajoute l'élément au tableau
                $tmp3[$i-1][] = @$tmp2[1];
             }
          // et on retourne le tableau dans la fonction
          return $tmp3;
       }
    }
     
    // Recherche des données allopass
    $maChaineXML = file_get_contents( "http://payment.allopass.com/api/getnum.apu?idd=521820&format=3&iso_countries=1" );
    $xml = lit_xml($maChaineXML,"bracket",array("country"));
     
    foreach($xml as $row) {
      echo $row[0];
      // affiche 11
      echo $row[1];
      // affiche audio
    }
    Mais j'obtiens l'erreur :
    PHP Notice: in file /allopass.php on line 47: Invalid argument supplied for foreach()
    ce qui correspond à : foreach($xml as $row) {

    J'ai essayé de débugger, mais je n'arrive à rien.

    J'espère que tu (ou qqn d'autre) peux m'aider. Merci !

  14. #14
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Fait un print_r de $xml et tu sauras lire la structure du tableau en retour de la fonction lit_xml.

    Je pense que c un tableau unique comme tu as mis qu'un tag de recherche 'country'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $xml = lit_xml($maChaineXML,"bracket",array("country"));
    print_r( $xml );
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  15. #15
    Invité
    Invité(e)
    Par défaut
    Rien ne s'affiche...

  16. #16
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Alors y a une coucounade dans la fonction lit_xml ...

    Mets des echos dans cette fonction tels que: (de manière à suivre le parse de ta chaine):

    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
     
    function lit_xml($fichier,$item,$champs) {
       // on lit le flux xml
       // implode peut ne pas être nécéssaire puisque $fichier est un string
       // Essayes avec et sans  if ....
       if($chaine = @implode("",$fichier)) {
          // on explode sur <item>
          // Dans l'exemple il s'agit de 'bracket'
          $tmp = preg_split("/<\/?".$item.">/",$chaine);
          // pour chaque <item> donc tous les bracket
          for($i=1;$i<sizeof($tmp)-1;$i+=2)
             // Echo du bracket considéré
             echo $tmp[$i];
             // on lit les champs demandés <champ> donc il s'agit de 'id' et 'type' ...
             foreach($champs as $champ) {
                $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
                // Echo du country considéré
                echo $tmp2;
                // on ajoute l'élément au tableau
                $tmp3[$i-1][] = @$tmp2[1];
             }
          // et on retourne le tableau dans la fonction
          return $tmp3;
       }
    }
    Essayes avec et sans if : Implode bloque peut être le bon déroulement ....
    C ça les fonctions non testées ...
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  17. #17
    Invité
    Invité(e)
    Par défaut
    Salut,

    J'ai ajouté des "echo" et je ne vois toujours rien, donc c'est le "implode" qui doit poser problème. Dans une doc, je vois que le 2ème paramètre de cette fonction est un tableau, mais est-ce que le cas ici ? selon moi, non, mais je débute ^^

    J'ai essayé de supprimer la ligne avec l'implode (et remplacé $chaine par $fichier dans la ligne : $tmp = preg_split("/<\/?".$item.">/",$fichier); )

    Là j'ai un message d'erreur :

    Undefined offset: 63 in D:\MonProjet\phpBB3\allopass.php on line 38

    qui correspond à :

    $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);

    Il y a donc un 2ème problème (au moins )

    Merci !

  18. #18
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Redonnes moi le code que tu as actuellement
    Pour l'erreur que tu as donnée.

    Sinon, l'implode dans ton cas ne sert à rien effectivement, de même que de faire un array des mots clés mais ce dernier point ne devrait pas être bloquant.
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  19. #19
    Invité
    Invité(e)
    Par défaut
    Voilà :

    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
    // Cette fonction sert de parseur
    function lit_xml($fichier,$item,$champs) {
       // on lit le flux xml
    //   if($chaine = @implode("",$fichier)) {
          // on explode sur <item>
          // Dans l'exemple il s'agit de 'bracket'
          $tmp = preg_split("/<\/?".$item.">/",$fichier);
          // pour chaque <item> donc tous les bracket
          for($i=1;$i<sizeof($tmp)-1;$i+=2)
             // on lit les champs demandés <champ> donc il s'agit de 'id' et 'type' ...
             foreach($champs as $champ) {
                $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
                // on ajoute l'élément au tableau
                $tmp3[$i-1][] = @$tmp2[1];
             }
          // et on retourne le tableau dans la fonction
          return $tmp3;
    //   }
    }
     
    // Recherche des données allopass
    $maChaineXML = file_get_contents( "http://payment.allopass.com/api/getnum.apu?idd=521820&format=3&iso_countries=1" );
    $xml = lit_xml($maChaineXML,"bracket",array("country"));
    print_r( $xml );

  20. #20
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bon, je l'ai faite au plus simple, en espérant que ça marche (mais ya pas de raisosns )

    Fonction:
    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
     
    // Cette fonction sert de parseur
    function lit_xml($fichier,$item,$champ) {
       // on lit le flux xml
      // Dans l'exemple il s'agit de 'bracket'
      $tmp = preg_split("/<\/?".$item.">/",$fichier);
          // pour chaque <item> donc tous les bracket
          // Du au split, les données à prendre sont à 1, 3, 5 etc
          $j = 0;
          for($i=1;$i<sizeof($tmp)-1;$i+=2)
             // on lit le champ demandé <country>
             $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
             // Du au split, les données à prendre sont à l'index 1 
             $tmp3[$j++][] = $tmp2[1];
             // Pour vérif
             echo "$tmp2[1]";
          }
          // et on retourne le tableau dans la fonction
          return $tmp3;
    }

    Et appel + Visu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    // Recherche des données allopass
    $maChaineXML = file_get_contents( "http://payment.allopass.com/api/getnum.apu?idd=521820&format=3&iso_countries=1" );
    $xml = lit_xml($maChaineXML,"bracket","country");
    print_r( $xml );
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

Discussions similaires

  1. [SimpleXML] Parser un flux xml avec SimpleXMLElement
    Par DeezerD dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 22/11/2006, 18h07
  2. [C#] Comment parser un flux XML ?
    Par Dunkan dans le forum C#
    Réponses: 1
    Dernier message: 22/09/2006, 13h32
  3. Parser un flux XML
    Par Paulux1 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 31/07/2006, 09h07
  4. parser un flux xml provenant d'une anim flash
    Par pyd001 dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2006, 10h43

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