[PHP] Parser, fonctionnement??

Parser, fonctionnement?? [PHP] - Programmation

Marsh Posté le 03-05-2001 à 15:37:41    

J'utilise un parser en php mais je ne comprends pas à quels moments sont appellés les fonctions StartElement et EndElement.
 
Si vous comprenez?
 
Donnees.xml:
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<TERRITOIRE>
   <ROW>
      <COMMUNE>35331</COMMUNE>
      <REVMENAGE>114150</REVMENAGE>
   </ROW>
   <ROW>
      <COMMUNE>35332</COMMUNE>
      <REVMENAGE>75739</REVMENAGE>
   </ROW>
</TERRITOIRE>

 
Script php:
 
<?
global $debut,$nbredonnee,$tableau,$ligne,$i;
$file="Donnees.xml";  
 
$i=-1;
function startElement($parser, $name, $attribs) {  
    global $debut,$nbredonnee,$i;
    if($name=="ROW" ){
     $i++;
     $debut=1;
     $nbredonnee=1;
    }  
}  
function endElement($parser, $name) {  
 if($name=="ROW" ){
  echo "<br>";
 }
}  
function characterData($parser, $data) {  
    global $tableau,$debut,$nbredonnee,$ligne,$i;
    if($debut==1){
     $debut=0;
     echo "ligne n°".$i;
     $tableau[$i][0]=$data;
     echo " commune: ".$tableau[$i][0];
    }else{
     $tableau[$i][$nbredonnee]=$data;
     echo $tableau[$i][$nbredonnee];
     $nbredonnee++;
    }
}  
 
$xml_parser = xml_parser_create();  
xml_set_element_handler($xml_parser, "startElement", "endElement" );  
xml_set_character_data_handler($xml_parser, "characterData" );  
if (!($fp = fopen($file, "r" ))) {  
die("could not open XML input" );  
}  
while ($data = fread($fp, 4096)) {  
     if (!xml_parse($xml_parser, $data, feof($fp))) {  
         die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));  
     }  
}  
echo "tab:".$tableau[0][0]."<br>";
echo "tab:".$tableau[0][1]."<br>";
echo "tab:".$tableau[1][0]."<br>";
echo "tab:".$tableau[1][1]."<br>";
echo "count:".count($tableau);
xml_parser_free($xml_parser);
?>

 
A la fin du script, quand j'affiche le contenu de $tableau,il n'y a rien dans ce tableau (pas aux endroits 0,1 mais plus loin dans le tableau),donc $nbredonnee est incrémenté sans que je m'en rende compte. D'où mon topic
 
SVP un ch'ti coup pouce, please!
:)

Reply

Marsh Posté le 03-05-2001 à 15:37:41   

Reply

Marsh Posté le 03-05-2001 à 17:53:08    

Allez juste un p'tit coup de main, pas longtemps...

Reply

Marsh Posté le 04-05-2001 à 01:29:51    

essaie de declarer 'tableau' en debut de script , en dehors d'une fonction ...
 
$tableau = array();


---------------
Do androïds dream of electric sheep ?
Reply

Marsh Posté le 04-05-2001 à 10:15:20    

ça change rien, j'ai trouvé où le srcipt a mis des données dans le tableau en rajoutant ça à la fin:
 
script:
-------
....
echo "tableau:<br>";
for($h=0;$h<2;$h++){
 for($k=0;$k<6;$k++){
  echo "tab[$h][$k]:".$tableau[$h][$k]."<br>";
 }
 echo "<br>";
}

 
Voici le résultat:
------------------
tableau:
tab[0][0]:  
tab[0][1]:  
tab[0][2]:35331
tab[0][3]:  
tab[0][4]:  
tab[0][5]:114150
 
tab[1][0]:  
tab[1][1]:  
tab[1][2]:35332
tab[1][3]:  
tab[1][4]:  
tab[1][5]:75739

 
Je vois pas pourquoi cela se trouve en colonne 2 et 5???
Peut être que je suis miro?

Reply

Marsh Posté le 04-05-2001 à 10:42:52    

Je pense avoir trouvé!
A mon avis, la fonction characterData est appellée entre les balises <TERRITOIRE> et <ROW> et entre les balises <ROW> et <COMMUNE> du coup c'est pour ça que $nbredonnee est incrémenté de 2 de trop à chaque fois!
 
Comment puis-je résoudre cela?  
-Tester si $data est constitué que d'espace et de retours à la ligne?
-Tester si la balise qui suit est fermante, si ce n'est pas le cas, les données doivent être ignorées.

Reply

Marsh Posté le 04-05-2001 à 12:17:21    

J'ai réussit en testant la longueur de trim($data) au début de la fonction characterData si elle est nulle, j'ignore cette data!
 
Par contre, je n'arrive pas à parser une variable à la place d'un fichier. Pourun fichier, on analyse ligne par ligne :  
 
while ($data = fread($fp, 4096)) {  
     if (!xml_parse($xml_parser, $data, feof($fp))) {  
         die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));  
     }  
}

 
mais pour une variable, je voulais l'analyser d'un seul coup :
 
xml_parse($xml_parser, $data, ???)
 
mais que mettre comme condition de fin?
 
Une idée?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed