Help - Search - Member List - Calendar
Full Version: [php 4] - Parseur De Fichiers Xml
OpenSpace > Zone Ordinateurs > Programmation
Bgw
Ben j'ai fait un fichier XML très simple pour tester puis un script PHP très simple lui aussi, que voici :

CODE

<?php
  $file = "articletest.xml";  
 
  $pageContent = "";
 
  function startElement($parser, $name, $attrs){  
     global $pageContent;
     
     echo "<$name><br>";
     if(sizeof($attrs) > 0){
        $pageContent .= "Attributs: ";
        foreach($attrs as $key => $value)
           $pageContent .= "$key,$value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
     }
  }
 
  function endElement($parser, $name){
     global $pageContent;
     
     $pageContent .= "<br></$name><br>";
  }
 
  function characterData($arser, $data){
     global $pageContent;
     
     $pageContent .= $data . "<br>";
  }
 
  $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("Impossible d'ouvrir le fichier <i>$file</i>");
  }
 
  while($data=fread($fp,4096)){
     if(!xml_parse($xml_parser, $data, feof($fp))){
        die(sprintf("Erreur XML: %s à la ligne %d",
        xml_error_string(xml_get_error_code($xml_parser)),
        xml_get_current_line_number($xml_parser)));
     }
  }
 
  xml_parser_free($xml_parser);
 
  echo $pageContent;
 
?>


seulement (copiez le et essayez de l'utiliser) il semblerait que le EndElement ne fonctionne pas !

LA prochaine étape, vous vous en doutez sera de ne pas afficher les balises mais de générer ce quyi y correspond !

Et pour ceux qui me disent que je réinvente la roue je répondrai oui, certainement seulement ... Il n'y a pas de DOM sur tous les hébergeurs hélas
Guepi
première erreur de saisie :
QUOTE

(...)
function characterData($parser,
(...)


Et j'obtiens bien lecontenu du fichier xml suivant :
CODE
<?xml version='1.0'?>
<!DOCTYPE chapter SYSTEM "/just/a/test.dtd" [
<!ENTITY plainEntity "FOO entity">
<!ENTITY systemEntity SYSTEM "xmltest2.xml">
]>
<chapter>
<TITLE>Title &plainEntity;</TITLE>
<para>
 <informaltable>
  <tgroup cols="3">
   <tbody>
    <row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row>
    <row><entry>a2</entry><entry>c2</entry></row>
    <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
   </tbody>
  </tgroup>
 </informaltable>
</para>
&systemEntity;
<sect1 id="about">
 <title>About this Document</title>
 <para>
  <!-- this is a comment -->
  <?php print 'Hi!  This is PHP version '.phpversion(); ?>
 </para>
</sect1>
</chapter>






Bgw
C'est bizzare parce que le character data foncrtionnait correctement...
Le problème venait du end element !


bon je teste ça ce soir chez moi (au boulot je peux pas, ASP inside)

Merci Guepi.
Guepi
EasyPHP inside biggrin.gif

Explique moi le problème avec EndElement() ...
Bgw
Maintenant le comportement est un peu plus étrange lol

voilà ce qu'il me sort avec ton fichier
QUOTE
<CHAPTER><TITLE><PARA><INFORMALTABLE><TGROUP><TBODY><ROW><ENTRY><ENTRY><ENTRY><ROW><ENTRY><ENTRY><ROW><ENTRY><ENTRY><ENTRY><SECT1><TITLE><PARA> Title FOO entity
</TITLE>
Attributs: COLS,3       a1
</ENTRY>
Attributs: MOREROWS,1      b1
</ENTRY>
c1
</ENTRY>

</ROW>
a2
</ENTRY>
c2
</ENTRY>

</ROW>
a3
</ENTRY>
b3
</ENTRY>
c3
</ENTRY>

</ROW>

</TBODY>

</TGROUP>

</INFORMALTABLE>

</PARA>
Attributs: ID,about       About this Document
</TITLE>

</PARA>

</SECT1>

</CHAPTER>


Je comprends pas pourquoi il me mets tous les start element au début comme ça et les end element dans un ordre quelque peu étrange !



Guepi
pkoi tu utilises pas le script de fr.php.net ???

CODE
<?php
$file = "data.xml";
$depth = array();
function startElement($parser, $name, $attrs) {
   global $depth;
   for ($i = 0; $i < $depth[$parser]; $i++) {
       print "  ";
   }
   print "$name\n";
   $depth[$parser]++;
}
function endElement($parser, $name) {
   global $depth;
   $depth[$parser]--;
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
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)));
   }
}
xml_parser_free($xml_parser);
?>




Bgw
En essayant ton code Hier soir je me suis apperçu qu'il faisait exactement la même chose que le mien hélas.

Moi j'aimerais qu'il soit capable de m'afficher <html><head></head><body><p>...</p><p>...</p></body></html>

et pas <html><head><body><p><p>.....
Guepi
je l'ai ton truc ...

Dans startElement, tu fais un echo de tes balises <$name>, alors qu'il ne faudrait pas !

voilà mon code smile.gif
CODE
<?php
 $file = "articletest.xml";

 $pageContent = "";

 function startElement($parser, $name, $attrs){
    global $pageContent;

    //echo "<$name><br>";
    $pageContent .="<$name><br>";
    if(sizeof($attrs) > 0){
       $pageContent .= "Attributs: ";
       foreach($attrs as $key => $value)
          $pageContent .= "$key -> $value &nbsp;&nbsp;";
    }
 }

 function endElement($parser, $name){
    global $pageContent;

    $pageContent .= "</$name>";
 }

 function characterData($parser, $data){
    global $pageContent;

    $pageContent .= $data . "<br>";
 }

 $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("Impossible d'ouvrir le fichier <i>$file</i>");
 }

 while($data=fread($fp,4096)){
    if(!xml_parse($xml_parser, $data, feof($fp))){
       die(sprintf("Erreur XML: %s à la ligne %d",
       xml_error_string(xml_get_error_code($xml_parser)),
       xml_get_current_line_number($xml_parser)));
    }
 }

 xml_parser_free($xml_parser);



?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
       <title>xml.php</title>
</head>

<body>

<?
 echo $pageContent;
?>

</body>
</html>




Guepi
Alors BgW, ça donne quoi chez toi ?
Bgw
ça marche merci wink.gif
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2024 Invision Power Services, Inc.