|
Publicité | ||||||||||||||||||||||
|
|
#1 |
![]() Nom : Nicolas Vallée
Inscription: décembre 2005
Âge: 26
Messages: 9 275
|
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(); ?> le probleme vient sans doute des $this->nom_fonction definis dans initParser() mais je ne comprend pas... Merci par avance. |
|
00
|
|
|
#2 |
![]() 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(); ?> |
|
00
|
|
|
#3 |
|
Membre émérite
![]() Inscription: février 2006
Localisation: 127.0.0.1
Messages: 851
|
-> bookmark !
Ce serait tellement mieux en couleurs..
__________________
Consultant idéaliste. |
|
|
00
|