Parser XML attributs

Petit nouveau ! | 2 Messages

29 avr. 2009, 16:09

Bonjour,

étant débutant, j'en appelle à votre aide:

Je souhaite afficher uniquement les attributs titre et departement qui correspondent à la date 7/9/2009.

agenda.xml

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <agenda> <event date="6/9/2009" numero="1" departement="32" feuille="division" population="adulte" competition="competitif" titre="Petanque Regional Samatan" ><![CDATA[<i> CDSA 32 simple tout loisir</i>]]></event> <event date="7/9/2009" numero="2" departement="31" feuille="division" population="enfant" competition="competitif" titre="Natation" ><![CDATA[<i> CDSA 31</i>]]></event> </agenda>
parseur.php

Code : Tout sélectionner

<? // Fichier à analyser $file = "agenda.xml"; // variable de la profondeur du parcours de l'arbre $depth = array(); // Etat de la pile de parcours du document XML $stack = array(); // Valeur d'un dernier élément lu $globaldata =""; // Fonction associée à l’événement début d’élément function startElement($parser, $name, $attrs) { global $depth; global $stack; for ($i = 1; $i < $depth[$parser]; $i++) {print " ";} array_push($stack,$name); $depth[$parser]++; //affichage des attributs de l'élément while (list ($key, $val) = each ($attrs)) {echo "$key $val";} print " "; } // Fonction associée à l’événement fin d’élément function endElement($parser, $name) { global $depth; global $stack; global $globaldata; for ($i = 0; $i < $depth[$parser]-1; $i++) {print " ";} $depth[$parser]--; array_pop($stack); } // Fonction associée à l’événement données textuelles function characterData($parser, $data) { global $globaldata; $globaldata = $data; } // Fonction associée à l’événement de détection d'un appel d'entité externe function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) { if ($systemId) { if (!list($parser, $fp) = new_xml_parser($systemId)) { printf("Impossible d'ouvrir %s à %s\n", $openEntityNames, $systemId); return FALSE; } while ($data = fread($fp, 4096)) { if (!xml_parse($parser, $data, feof($fp))) { printf("Erreur XML : %s à la ligne %d lors du traitement de l'entité %s\n", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser), $openEntityNames); xml_parser_free($parser); return FALSE; } } xml_parser_free($parser); return TRUE; } return FALSE; } // Fonction de création du parser et d'affectation // des fonctions aux gestionnaires d'événements function new_xml_parser($file) { global $parser_file; //création du parseur $xml_parser = xml_parser_create(); //Activation du respect de la casse du nom des éléments XML xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); //Déclaration des fonctions à rattacher au gestionnaire d'événement xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler"); //Ouverture du fichier if (!($fp = @fopen($file, "r"))) { return FALSE; } //Transformation du parseur en un tableau if (!is_array($parser_file)) { settype($parser_file, "array"); } $parser_file[$xml_parser] = $file; return array($xml_parser, $fp); } // Appel à la fonction de création et d'initialisation du parseur if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("Impossible d'ouvrir le document XML"); } // Traitement de la ressource XML while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("Erreur XML : %s à la ligne %d\n", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } // Libération de la ressource associée au parser xml_parser_free($xml_parser); ?>
Merci

ViPHP
ViPHP | 3300 Messages

29 avr. 2009, 16:29

le parseur xml que tu utilises reposes su la méthode SAX qui est une très bonne méthode en soi mais apropriée pour des flux de données (des gros fichiers xml, genre vraiment gros) dans ton cas j'opterais plutot pour simplexml qui te faciliterais considérablement la vie :)
Fait du php depuis que ca existe ou presque :)

Petit nouveau ! | 2 Messages

14 mai 2009, 15:54

Code : Tout sélectionner

<? $file = "agenda.xml"; $contenu = fread(fopen($file, "r"), filesize($file)); $test[]="ici"; $numero="1"; preg_match_all('/<event date="(.+)".+numero="'.$numero.'".+departement="([0-9]+)".+titre="(.+)".+/',$contenu, $captures); /* Explications : on recherche <event date= suivi de la date (bien respecter les \/) puis suivi de n'importe quoi .+ et de departement=" ensuite on capture le numéro du dept suivi de " et de n'importe quoi .+ suivi de titre=" on capture le titre qui se termine nécessairement par " */ $dates=$captures[1]; $depts=$captures[2]; $titres=$captures[3]; foreach($dates as $indice => $valeur) print "Date : $dates[$indice] Titre : $titres[$indice] Département : $depts[$indice]<p>"; ?>

ViPHP
ViPHP | 3300 Messages

14 mai 2009, 16:11

pas mal mais difficile à faire évoluer, si ça te convient et que tu n'as pas besoin de + c'est correct :)
Fait du php depuis que ca existe ou presque :)

Eléphant du PHP | 217 Messages

14 mai 2009, 18:24

Utilisez une requete xpath sur un DOMdocument pour sélectionner les noeud qui vous interresse.
La solution sera ainsi plus évolutive si d'autres critères doivent être pris en compte ulterieurement,

http://fr2.php.net/manual/fr/class.domxpath.php