IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topicStart Poll

En ligne · [ Standard ] · Linéaire+

> [php 4] - Parseur De Fichiers Xml, avec les méthodes SAX...

niko
post 19/05/2003 10:27
Message #1


Muggle
****

Groupe : Membres
Messages : 717
Inscrit le : 03/07/2002 23:00
Lieu : Toulouse
Membre no. 85



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


--------------------
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Guepi
post 19/05/2003 13:55
Message #2


Troll
*****

Groupe : Membres
Messages : 4,831
Inscrit le : 23/06/2002 23:00
Lieu : Ronchin, Nord, France
Membre no. 75



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>






--------------------
Le racisme est un crime, pas une opinion !
Extrait d'un tag sur un mur...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
niko
post 19/05/2003 14:26
Message #3


Muggle
****

Groupe : Membres
Messages : 717
Inscrit le : 03/07/2002 23:00
Lieu : Toulouse
Membre no. 85



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.


--------------------
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Guepi
post 19/05/2003 14:29
Message #4


Troll
*****

Groupe : Membres
Messages : 4,831
Inscrit le : 23/06/2002 23:00
Lieu : Ronchin, Nord, France
Membre no. 75



EasyPHP inside biggrin.gif

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


--------------------
Le racisme est un crime, pas une opinion !
Extrait d'un tag sur un mur...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
niko
post 19/05/2003 16:29
Message #5


Muggle
****

Groupe : Membres
Messages : 717
Inscrit le : 03/07/2002 23:00
Lieu : Toulouse
Membre no. 85



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 !



--------------------
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Guepi
post 19/05/2003 17:26
Message #6


Troll
*****

Groupe : Membres
Messages : 4,831
Inscrit le : 23/06/2002 23:00
Lieu : Ronchin, Nord, France
Membre no. 75



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




--------------------
Le racisme est un crime, pas une opinion !
Extrait d'un tag sur un mur...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
niko
post 20/05/2003 9:29
Message #7


Muggle
****

Groupe : Membres
Messages : 717
Inscrit le : 03/07/2002 23:00
Lieu : Toulouse
Membre no. 85



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


--------------------
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Guepi
post 22/05/2003 11:53
Message #8


Troll
*****

Groupe : Membres
Messages : 4,831
Inscrit le : 23/06/2002 23:00
Lieu : Ronchin, Nord, France
Membre no. 75



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>




--------------------
Le racisme est un crime, pas une opinion !
Extrait d'un tag sur un mur...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Guepi
post 22/05/2003 20:51
Message #9


Troll
*****

Groupe : Membres
Messages : 4,831
Inscrit le : 23/06/2002 23:00
Lieu : Ronchin, Nord, France
Membre no. 75



Alors BgW, ça donne quoi chez toi ?


--------------------
Le racisme est un crime, pas une opinion !
Extrait d'un tag sur un mur...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
niko
post 23/05/2003 3:07
Message #10


Muggle
****

Groupe : Membres
Messages : 717
Inscrit le : 03/07/2002 23:00
Lieu : Toulouse
Membre no. 85



ça marche merci wink.gif


--------------------
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicTopic OptionsStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :
 

Version bas débit Nous sommes le : : 19/04/2024 13:07