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 :

Analyseur XML et variable globale


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 19
    Points
    19
    Par défaut Analyseur XML et variable globale
    Bonjour,

    Afin d'afficher mon flux rss dans la page d'acceuil de mon site, j'utilise le script suivant :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    <?php
        $fichier = "rss.xml";
     
        // Ma propre fonction de traitement des balises ouvrantes
        function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
        {
            // En fait... nous nous conteterons de mémoriser le nom de la balise
            // afin d'en tenir compte dans la fonction "fonctionTexte"
     
            global $derniereBaliseRencontree;
     
            $derniereBaliseRencontree = $nomBalise;
        }
     
        // Ma propre fonction de traitement des balises fermantes
        function fonctionBaliseFermante($parseur, $nomBalise)
        {
            global $derniereBaliseRencontree;
            global $titre;
            global $lien;
    		global $description;
     
            switch ($nomBalise) {
                case "CHANNEL" :  
                    $titre = "";
                    $lien = "";
                    break;
                case "ITEM" :
                    // nous quittons un bloc item
                    // nous pouvons afficher le titre de l'article
                    echo "- <a href=\"$lien\">$titre</a> : $description<br />";
                    // et on oublie
                    $titre = "";
                    $lien = "";
    				$desciption="";
                    break;
            }
     
            // On oublie la dernière balise rencontrée
            // et tout le reste
            $derniereBaliseRencontree = "";
        }
     
        // Ma propre fonction de traitement du texte
        // qui est appelée par le "parseur"
        function fonctionTexte($parseur, $texte)
        {
            global $derniereBaliseRencontree;
            global $titre;
            global $lien;
    		global $description;
     
            // Nous n'affichons pas le texte ou lien directement
            // nous attendrons de rencontrer la balise fermante
            // et ainsi d'avoir tous les élements avant l'affichage.
            // ATTENTION: Par défaut les noms des balises sont
            //            mises en majuscules
     
            switch ($derniereBaliseRencontree) {
                case "TITLE": 
                    $titre = $texte;
                    break;
                case "LINK":
                    $lien = $texte;
                    break;
    			case "DESCRIPTION":
    				$description=$texte;
    				break;
            }         
        }
     
        // Création du parseur XML
        $parseurXML = xml_parser_create();
     
        // Je précise le nom des fonctions à appeler
        // lorsque des balises ouvrantes ou fermantes sont rencontrées
        xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante"
                                           , "fonctionBaliseFermante");
     
        // Je précise le nom de la fonction à appeler
        // lorsque du texte est rencontré
        xml_set_character_data_handler($parseurXML, "fonctionTexte");
     
        // Ouverture du fichier
        $fp = fopen($fichier, "r");
        if (!$fp) die("Impossible d'ouvrir le fichier XML");
     
        // Lecture ligne par ligne
        while ( $ligneXML = fgets($fp, 4096)) {
            // Analyse de la ligne
            // REM: feof($fp) retourne TRUE s'il s'agit de la dernière
            //      ligne du fichier.
            xml_parse($parseurXML, $ligneXML, feof($fp)) or
                die("Erreur XML");
        }
     
        xml_parser_free($parseurXML);
        fclose($fp);
    ?>
    J'ai testé le scripte avec le fichier XML suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0">
    	<channel>
        	<title>JCBodyboard.com</title>
        	<link>http://www.jcbodyboard.com/</link>
        	<description>Le site 100% bodyboard</description>
    		<item>
        		<title>Nouvelle version de JCBodyboard.com</title>
        		<link>http://www.jcbodyboard.com/</link>  
        		<description>Une interface plus agréable et plus pratique, ainsi que plus de contenu : nouveau catalogue des boards, nouveau guide des spots.</description>
    		<pubDate>Mon, 01 Oct 2007 17:28:47 GMT</pubDate>
    		</item>  
      </channel> 
    </rss>
    J'ai un problème pour afficher le text contenu dans la balise Description de l'item : le text est tronqué et ce qui est affiché est :
    éable et plus pratique, ainsi que plus de contenu : nouveau catalogue des boards, nouveau guide des spots.
    J'ai testé avec un echo la fonction "fonctionTexte" et la variable global $Description contient bien tout le text. Par contre, dans la fonction "fonctionBaliseFermante" qui gère l'écriture, il en manque une partie. Je ne comprend pas d'ou vient le problème !!

    Merci d'avance,

  2. #2
    Inscrit
    Avatar de Caerbannog
    Inscrit en
    Novembre 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 206
    Points : 273
    Points
    273
    Par défaut
    Dans la doc de "xml_set_character_data_handler" on trouve :
    "Il peut être appelé plusieurs fois dans chaque fragment (e.g. pour les chaînes non-ASCII)."

    Il suffit donc de rajouter un point pour concaténer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			case "DESCRIPTION":
    				$description .=$texte;
    				break;

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/04/2011, 21h11
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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