Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

OpenSpace _ Programmation _ [php 4] - Parseur De Fichiers Xml

Ecrit par: Bgw 19/05/2003 10:27

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

Ecrit par: Guepi 19/05/2003 13:55

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>




Ecrit par: Bgw 19/05/2003 14:26

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.

Ecrit par: Guepi 19/05/2003 14:29

EasyPHP inside biggrin.gif

Explique moi le problème avec EndElement() ...

Ecrit par: Bgw 19/05/2003 16:29

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 !

Ecrit par: Guepi 19/05/2003 17:26

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);
?>


Ecrit par: Bgw 20/05/2003 9:29

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>.....

Ecrit par: Guepi 22/05/2003 11:53

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>


Ecrit par: Guepi 22/05/2003 20:51

Alors BgW, ça donne quoi chez toi ?

Ecrit par: Bgw 23/05/2003 3:07

ça marche merci wink.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)