Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML
XML Forum d'entraide sur XML avec PHP. Exemples : SimpleXML, OpenXML... Avant de poster -> FAQ XML, Cours XML et Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 09/03/2006, 17h50   #1
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Nom : Nicolas Vallée
Inscription: décembre 2005
Âge: 26
Messages: 9 275
Par défaut [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 :
<?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.
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 20h45   #2
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Nom : Nicolas Vallée
Inscription: décembre 2005
Âge: 26
Messages: 9 275
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 :
<?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();
?>
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 20h49   #3
Membre émérite
 
Avatar de macbook
 
Inscription: février 2006
Localisation: 127.0.0.1
Messages: 851
-> bookmark !

Ce serait tellement mieux en couleurs..
__________________
Consultant idéaliste.
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h02.


Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.