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

Bibliothèques et frameworks PHP Discussion :

[XML] [EXPAT] parser sous forme de classe


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut [XML] [EXPAT] parser sous forme de classe
    J'ai trouve un parser qui repond parfaitement a mon besoin
    http://fr2.php.net/manual/fr/ref.xml.php

    c'est celui qui utilise $obj->tree


    mais je souhaite en faire une classe... fonctionnant sous php4 et php5

    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
    <?php
    class Menu {
      var $xml_data;
      var $parser;
      var $xml;
      var $tree;
     
      function Menu() {
        $this->tree = '$this->xml';
      }
     
      function init($file) {
        $fd = fopen($file,"r")
        or die("Impossible d'ouvrir le fichier.");
     
        $this->xml_data = fread($fd,filesize($file));
        fclose($fd);
      }
     
      function initParser() {
        $this->parser = xml_parser_create();
        xml_set_element_handler($this->parser, "$this->startElement", "$this->endElement");
        xml_set_character_data_handler($this->parser, "$this->characterData");
      }
     
      function parse() {
       if (!xml_parse($this->parser, $this->xml_data)) {
           die(sprintf("XML error: %s at line %d",
                       xml_error_string(xml_get_error_code($this->parser)),
                       xml_get_current_line_number($this->parser)));
       }
      }
     
      function startElement($parser, $name, $attrs) {
        // If var already defined, make array
        eval('$test=isset('.$this->tree.'->'.$name.');');
        if ($test) {
          eval('$tmp='.$this->tree.'->'.$name.';');
          eval('$arr=is_array('.$this->tree.'->'.$name.');');
          if (!$arr) {
            eval('unset('.$this->tree.'->'.$name.');');
            eval($this->tree.'->'.$name.'[0]=$tmp;');
            $cnt = 1;
          }
        else {
          eval('$cnt=count('.$this->tree.'->'.$name.');');
        }
     
        $this->tree .= '->'.$name."[$cnt]";
       } else {
         $this->tree .= '->'.$name;
       }
       if (count($attrs)) {
           eval($this->tree.'->attr=$attrs;');
       }
      }
     
      function endElement($parser, $name) {
        // Strip off last ->
        for($a=strlen($this->tree);$a>0;$a--) {
          if (substr($this->tree, $a, 2) == '->') {
            $this->tree = substr($this->tree, 0, $a);
            break;
         }
      function characterData($parser, $data) {
        eval($this->tree.'->data=\''.$data.'\';');
      }
     
      function affich() {
        echo "<pre>\n";
        print_r($this->xml);
        echo "</pre>";
      }
    }
     
    $menu = new Menu();
     
    $menu->init("../menu.xml");
    $menu->initParser();
    $menu->parse();
    $menu->affich();
    ?>
    mais ca ne marche pas

    le probleme vient sans doute des $this->nom_fonction definis dans initParser()
    mais je ne comprend pas...

    Merci par avance.
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Eureka... j'avais juste oublié xml_set_object

    forcemment... il n'y avait pas d'erreurs, mais ça ne marchait pas

    voilà le code... ça peut toujours servir

    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
    <?php
    class Menu {
      var $xml_data;
      var $parser;
      var $xml;
      var $tree;
     
      function Menu() {
        $this->tree = '$this->xml';
      }
     
      function init($file) {
        $fd = fopen($file,"r")
        or die("Impossible d'ouvrir le fichier.");
     
        $this->xml_data = fread($fd,filesize($file));
        fclose($fd);
      }
     
      function initParser() {
        $this->parser = xml_parser_create();
        xml_set_object($this->parser,&$this);
        xml_set_element_handler($this->parser, "startElement", "endElement");
        xml_set_character_data_handler($this->parser, "characterData");
      }
     
      function parse() {
       if (!xml_parse($this->parser, $this->xml_data)) {
           die(sprintf("XML error: %s at line %d",
                       xml_error_string(xml_get_error_code($this->parser)),
                       xml_get_current_line_number($this->parser)));
       }
      }
     
      function startElement($parser, $name, $attrs) {
        // If var already defined, make array
        eval('$test=isset('.$this->tree.'->'.$name.');');
        if ($test) {
          eval('$tmp='.$this->tree.'->'.$name.';');
          eval('$arr=is_array('.$this->tree.'->'.$name.');');
          if (!$arr) {
            eval('unset('.$this->tree.'->'.$name.');');
            eval($this->tree.'->'.$name.'[0]=$tmp;');
            $cnt = 1;
          }
        else {
          eval('$cnt=count('.$this->tree.'->'.$name.');');
        }
     
        $this->tree .= '->'.$name."[$cnt]";
       } else {
         $this->tree .= '->'.$name;
       }
       if (count($attrs)) {
           eval($this->tree.'->attr=$attrs;');
       }
      }
     
      function endElement($parser, $name) {
        // Strip off last ->
        for($a=strlen($this->tree);$a>0;$a--) {
          if (substr($this->tree, $a, 2) == '->') {
            $this->tree = substr($this->tree, 0, $a);
            break;
         }
      }
    }
     
      function characterData($parser, $data) {
        eval($this->tree.'->data=\''.$data.'\';');
      }
     
      function affich() {
        echo "<pre>\n";
        print_r($this->xml);
        echo "</pre>";
      }
    }
     
    $menu = new Menu();
     
    $menu->init("../menu.xml");
    $menu->initParser();
    $menu->parse();
    $menu->affich();
    ?>
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    -> bookmark !

    Ce serait tellement mieux en couleurs..
    Consultant idéaliste.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/07/2014, 13h36
  2. [JDOM] Parser du xml sous forme de string avec JDOM
    Par Lord Yu dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 02/02/2010, 12h47
  3. [SAX] Parser un XML sans le charger en mémoire sous forme de document
    Par tdeco dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 10/08/2007, 13h00
  4. renvoyer des données sous forme de XML hiérarchique
    Par DiGueDao dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/01/2005, 18h06
  5. XSL pour visualiser arbre XML sous forme de tableau en HTML
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 28/03/2003, 10h55

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