Principe du stream parsing: le parseur lit le fichier XML et "crache" des informations:
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.
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)
function startElement($parser, $name, $attrs)
{
print "j'ai trouvé l'éléement: $name <br>";
}
<?
$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 " ";
}
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 " ";
}
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);
?>
<?
$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);
?>