UP PREVIOUS NEXT   Technologies Internet et Education, © TECFA
  5. "Stream-parsing"

5. "Stream-parsing"

Principe du stream parsing: le parseur lit le fichier XML et "crache" des informations:

Identification des "Event Handlers" pour les éléments

Définition:

xml_set_element_handler ($parseur, "start_event_handler", "end_event_handler")

Définition formelle du manuel:

bool xml_set_element_handler ( resource parser, callback start_element_handler, callback end_element_handler )

nom_handler_début" et "nom_handler_fin" sont fonctions que vous définissez.

Définition des "Event Handlers

Les fonctions start-event_handler et end_event_handler (vous pouvez choisir d'autres noms) doivent obéir aux définitions suivantes:

start_element_handler ($parser, $nom_element, $attributs)

end_element_handler ($parser, $nom_element)

 

Exemple:

function startElement($parser, $name, $attrs)
{
    print "j'ai trouvé l'éléement: $name <br>";
   }

 

Identification du character data handler

xml_set_character_data_handler($parser, "characterData");

Définition du character data handler

characterData($parser, $data)

Exemple:

function characterData($xml_parser, $data)
{
    print $data;
}
 

Exemple 5-1: Structure d'un fichier xml en forme d'une liste des éléments

<?
$file = "story.xml";
$depth = 0;
 
# appelé au début d'une balise,l'imprime avec une jolie indentation
function startElement($parser, $name, $attrs) {
    global $depth;
    for ($i = 0; $i < $depth; $i++) {
        print "&nbsp;&nbsp;&nbsp;";
    }
    print "$name\n<br>";
    $depth[$parser]++;
}
# appelé à la fin d'une balise et imprime
function endElement($parser, $name) {
    global $depth;
    $depth[$parser]--;
    for ($i = 0; $i < $depth; $i++) {
        print "&nbsp;&nbsp;&nbsp;";
    }
    print "/$name\n<br>";
}
 
# créer un "parser"
$xml_parser = xml_parser_create();
 
# commence à "parser" 
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)));
    }
}
 
# libérer le "parser"
xml_parser_free($xml_parser);
 
?>

Exemple 5-2: Visualisation des données xml en html

 
<?
$file = "choco-chip.xml";
 
// Put the key in upper case !
$begin_array = array(
           "LIST"        => "<H1>RECIPE LIST</H1>",
           "RECIPE"      => "<HR>",
           "RECIPE_NAME" => "<H2>",
           "AUTHOR"      => "Author: <STRONG>",
           "MEAL"        => "<H3>",
           "COURSE"      => "<I>",
           "INGREDIENTS" => "<H3>Ingrediants</H3><OL>",
           "ITEM"        => "<LI>",
           "DIRECTIONS"  => "<H3>Directions</H3><BLOCKQUOTE>"
           );
 
$end_array = array(
           "LIST"        => "<BR>",
           "RECIPE"      => "<BR>",
           "RECIPE_NAME" => "</H3>",
           "AUTHOR"      => "</STRONG>",
           "MEAL"        => "</H2>",
           "COURSE"      => "</I>",
           "INGREDIENTS" => "</OL>",
           "ITEM"        => "</LI>",
           "DIRECTIONS"  => "</BLOCKQUOTE>"
           );
 
function startElement($parser, $name, $attrs)
{
    global $begin_array;
    // print "DEBUG: $name <br>";
    if ($htmlexpr = $begin_array[$name]) {
        print "$htmlexpr";
    }
}
 
function endElement($parser, $name)
{
    global $end_array;
    if ($htmlexpr = $end_array[$name]) {
        print "$htmlexpr";
    }
}

 
function characterData($parser, $data)
{
    print $data;
}
 
$xml_parser = xml_parser_create();
 
// use case-folding so we are sure to find the tag in $begin_array
// does this REALLY work ??? / DKS
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
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)));
  }
}
 
xml_parser_free($xml_parser);
 
?>

UP PREVIOUS NEXT -- TIE