juillet 18, 2002
Parseur XML avec PHP

Pascale,

je t'ai fait un exemple de parseur XML qui je pense devrait être simple, mais si tu as des doutes tu peux demander. En gros, tu as une fonction pour gérer la balise de début, une fonction pour gérer la balise de fin, et une pour les données à l'intérieur d'une balise. Si cela ne semble pas clair, dis le moi :)

Le programme s'appelle read-index4.php.

<?php

$file = "index.xml";
$depth = array();

print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n";
print "      \"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd\">\n";
print "<html>\n";
print "<head><title>Essai de lecture avec PHP</title></head>\n";
print "<body>\n";
print "<h1>lecture de la structure avec le script read-index4.php</h1>\n";
print "<p>Voir l'article de";
print " <a href=\"/weblog/archives/000065.html#000065\">";
print "Normandie WebLog</a></p>\n";

function startElement($parser, $name, $attrs) {
	global $currentTag;
	$currentTag = $name;
	switch($name) {
	case "NWNOMVILLE";
		echo "<h2>";
		break;
	case "NWNOMVILLE";
		echo "<p>";
		break;
	default:
		break;
		}
}

function endElement($parser, $name) {
	global $currentTag;
	$currentTag = $name;
	switch($name) {
	case "NWNOMVILLE";
		echo "</h2>";
		break;
	case "NWNOMVILLE";
		echo "</p>";
		break;
	default:
		break;
		}
	$currentTag = "";
}

function characterData($parser, $data) {
	global $currentTag;
	switch ($currentTag) {
	case "NWNOMVILLE":
		echo "Nom de la Commune: $data";
		break;

	case "NWREGION":
		echo "Nom de la region: $data";
		break;
	//etc
	
	default:
		break;
	}
}

$xml_parser = xml_parser_create();

xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

//ouvrir le fichier
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);
print "</pre></body></html>";

?>
Posted by karl at juillet 18, 2002 04:11 AM
Comments

J'ai cru trouver la solution en m'inspirant de ton parser... mais non. Même en déclarant le n° de ligne en variable globale, rien à faire, je ne la récupère pas pour l'utiliser dans mon script. C'est le pb avec les fonctions...
Il doit pourtant bien avoir une solution nom de d'là...

Posted by: Pascale on juillet 18, 2002 03:23 PM

Je n'ai pas bien compris ton principe de numéro de ligne. Tu peux m'expliquer ?

Merci :)

Posted by: karl on juillet 18, 2002 04:03 PM

Coucou,

Pour récuperer les données, le script lit le fichier ligne par ligne. N'ayant pas trouvé de moyen "simple" de lui dire :
"tu vas chercher la balise texte ouvrante, puis la balise texte fermante et tu m'extrais ce qu'il y a entre les deux",
je lui donne le n° de ligne et il extrait le texte hors balises.

Toutes les infos tiennent sur 1 ligne, sauf la partie texte. Donc :
Le texte commence ligne 21, il se finit à "nombre total de ligne -3", le script lit les données entre ces 2 lignes.

Si le texte ne commence plus à la ligne 21, mais à un nombre aléatoire dépendant des infos inscrites avant (les commentaires... les éditeurs etc.) tout se casse la figure.
Ton parser peut m'indiquer ce fameux n° de ligne avec xml_get_current_line_number . Mais je n'arrive pas à récuperer cette variable puisqu'elle est inclue dans la fonction, et donc non globale... Et même en la déclarant "global", ou "static".

Je fais sûrement qq chose de travers, mais je n'arrive pas à trouver quoi...

As-tu tout compris ?

Posted by: Pascale on juillet 19, 2002 08:53 AM

hmmmm

Justement un parseur XML fonctionne sans que tu es besoin de ligne puisqu'il détecte le contenu.
Tu luis dis je veux le contenu de cette balise et il te le donne.

C'est beaucoup plus simple, cela résonne en terme d'arbres XML et non pas en termes en lignes :)

Posted by: karl on juillet 19, 2002 12:19 PM

Bien sûr, mais cela ne résoud pas le pb de récupération de variable...
Et ton parser s'arrête à chaque balise xml OU html.
Il faudrait qu'il ne detecte QUE les balises xml.

Posted by: Pascale on juillet 19, 2002 12:37 PM
Post a comment
Name:


Email Address:


URL:


Comments:


Remember info?