1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P74 potx

5 234 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 142,69 KB

Nội dung

8.3 Import de données XML dans MySQL 343 analyse du document, enfin destruction du parseur. Ces trois méthodes sont valables quel que soit le document et seront donc reprises par héritage dans toutes les sous- classes. Outre la création du parseur, la principale caractéristique du constructeur est l’appel à la fonction xml_set_object() qui indique que le parseur est intégré à l’objet courant ($this) et que les déclencheurs sont des méthodes de cet objet. La méthode parse() est implantée de manière un peu plus robuste que celle de notre premier exemple. En particulier : 1. le fichier est analysé par tranche de 4 096 octets pour éviter de charger en mémoire un document trop volumineux ; la fonction xml_parse() prend en troisième argument un indicateur de fin de fichier (ici retourné par la fonction feof()) qui indique qu’on a atteint la dernière tranche du document ; 2. une gestion d’erreurs est mise en place, en testant le code retour de xml_parse(), et en appelant le cas échéant des fonctions décrivant l’erreur : une description détaillée de toutes ces fonctions XML/PHP est donnée dans l’annexe C. En plus de ces trois méthodes, la classe SAX propose une implantation « par défaut » des déclencheurs associés aux balises ouvrantes, fermantes et aux nœuds de texte (ou données caractères). Dans une implantation plus complète, la classe devrait également gérer les instructions de traitement, entités externes et autres catégories syntaxiques XML. Que font ces méthodes ? Le principe est de regarder, pour un élément dont le nom NomEl´ement est transmis en paramètre, si la classe comprend une méthode debutNomEl´ement ,uneméthodefinNomEl´ement , ou les deux. Si une telle méthode existe, elle est appelée. Sinon il y a deux possibilités : 1. soit l’objet $this est une instance de la super-classe SAX,etonafficheun message indiquant qu’une balise ouvrante ou fermante selon le cas a été rencontrée ; 2. soit l’objet est une instance d’une sous-classe, et dans ce cas l’absence d’une méthode pour l’élément indique que ce dernier doit être ignoré. En d’autres termes, un objet de la classe SAX peut être utilisé comme notre premier module, page 335, pour afficher le marquage du document au fur et à mesure qu’il est rencontré. Un objet d’une sous-classe de SAX en revanche doit explicitement fournir des méthodes de traitement des éléments, sinon il ne se passe rien. Les méthodes debutElement() et finElement() s’appuient sur les fonctions PHP suivantes : • method_exists() qui teste si une méthode est définie pour un objet, • call_user_func() qui permet de déclencher l’exécution d’une méthode pour un objet 2 , 2. En PHP, on désigne une fonction par son nom, et une méthode par un tableau contenant une paire (objet, nom de la méthode). 344 Chapitre 8. XML • enfin get_class() qui renvoie, en minuscules, le nom de la classe dont l’objet courant est une instance. VoicilamiseenœuvredecesfonctionsdanslaméthodedebutElement() : protected function debutElement ($parseur , $nom, $attrs) { // On recherche si une méthode nommée "debut {NomElement}" existe if ( method_exists ( $this , "debut$nom" )) { call_user_func ( array( $this , "debut$nom") , $parseur , $nom, $attrs); } else if ( get_class ($this) == "sax") { echo "Début d ’élément : &lt ; " . $nom . "&gt ;\n" ; } // Effacement des données caractères $this−>donnees = " " ; } Pour bien comprendre l’intérêt de cette conception qui peut sembler compliquée au premier abord, il suffit de constater que la création d’un analyseur pour un type donné de document se résume maintenant à créer une sous-classe de SAX et à placer dans cette sous-classe des méthodes debutNom et finNom spécifiques aux noms d’éléments du type de document. Voici la classe SAXFilm, sous-classe de SAX (noter le mot-clé extends), qui permet d’analyser nos documents contenant des films (voir l’exemple du document KillBill.xml, page 331). Exemple 8.16 webscope/application/classes/SAXFilm.php : Spécialisation de la classe pour traiter des films <?php /∗∗ ∗ Classe d’analyse avec le parseur SAX d’un document XML ∗ représentant un film avec ses acteurs. ∗ / require_once ("SAX.php"); class SAXFilm extends SAX { // Déclaration des variables stockant le résultat de l ’analyse // private $films , $nb_films , $i_acteur; // Constructeur function SAXFilm ($codage) { // On appelle le constructeur de la super−classe parent :: __construct ($codage) ; 8.3 Import de données XML dans MySQL 345 // On initialise les variables de la sous−classe $this−>films = array () ; $this−>nb_films = 0; $this−>i_acteur = 0; } // On définit les déclencheurs pour les différents éléments de FILM protected function finTITRE ($parseur , $nom) {$this−>films [ $this−>nb_films ][ ’ titre ’] = $this−>donnees ; } pr otect ed fu nctio n finANNEE ( $parseur , $nom) {$this−>films [ $this−>nb_films ][ ’annee ’ ] = $this−>donnees ; } protected function finCODE_PAYS ($parseur , $nom) {$this−>films [ $this−>nb_films ][ ’code_pays ’ ] = $this−>donnees ; } protected function finGENRE ($parseur , $nom) {$this−>films [ $this−>nb_films ][ ’genre ’ ] = $this−>donnees ; } protected function finRESUME ($parseur , $nom) {$this−>films [ $this−>nb_films ][ ’resume ’ ] = $this−>donnees ; } // Pour le metteur en scène pr otect ed fu nction debutREALISATEUR ( $parseur , $nom , $a t t r ) { $this−>films [ $this−>nb_films ][ ’ nom_realisateur ’] = $attr[ ’NOM’]; $this−>films [ $this−>nb_films ][ ’ prenom_realisateur ’] = $attr[ ’PRENOM’ ]; $this−>films [ $this−>nb_films ][ ’ annee_realisateur ’] = $ a t t r [ ’ANNEE_NAISSANCE ’ ] ; } // Pour un acteur protected function debutACTEUR ($parseur , $nom, $attr) { $this−>films [ $this−>nb_films ][ ’nom’ ][ $this−>i_acteur ] = $attr[ ’NOM’ ]; $this−>films [ $this−>nb_films ][ ’prenom ’ ][ $this−>i_acteur ] = $attr[ ’PRENOM’ ]; $this−>films [ $this−>nb_films ][ ’annee_naissance ’ ][ $this−> i_acteur ] = $ a t t r [ ’ANNEE_NAISSANCE ’ ] ; $this−>films [ $this−>nb_films ][ ’nom_role ’ ][ $this−>i_acteur ] = $ a t t r [ ’NOM_ROLE ’ ] ; $this−>i_acteur ++; } // Au début d’un élément FILM: on incrémente le compteur de // films , // on initialise le compteur des acteurs et les tableaux protected function debutFILM ( $parseur , $nom) { $this−>nb_films++; 346 Chapitre 8. XML $this−>films [ $this−>nb_films ] = array() ; $this−>films [ $this−>nb_films ][ ’nom’ ] = array() ; $this−>films [ $this−>nb_films ][ ’prenom ’] = array() ; $this−>films [ $this−>nb_films ][ ’annee_naissance ’] = array() ; $this−>films [ $this−>nb_films ][ ’nom_role ’ ] = array() ; $this−>i_acteur = 0; } /∗∗∗∗∗∗∗∗∗∗∗ Partie publique ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ / // Récupération d’un film public function getNbFilm () {return$this−>nb_films ; } public function getFilm ($id_film) { if ($id_film > 0 and $id_film <= $this−>nb_films) return $this−>films [ $id_film ]; else { // Mais non , cet id n ’ existe pas !!! trigger_error("Index incorrect pour accéder à un film : $id_film"); return array () ; } } } Cette sous-classe comprend essentiellement des méthodes pour traiter les élé- ments spécifiques d’un document <Film> : tout ce qui relève de la création et de l’utilisation du parseur est hérité de la classe SAX, et donc automatiquement disponible pour les objets de la classe SAXFilm. Dans le cas des éléments titre, annee, code_pays, etc., la chaîne à extraire est le contenu de l’élément, autrement dit le nœud de type texte situé sous l’élément dans l’arborescence. On récupère cette chaîne en déclenchant une fonction quand on rencontre la balise fermante. On sait alors que la chaîne est mémorisée dans l’attribut $this->donnees, et on la stocke dans le tableau des films. Dans le cas des éléments Realisateur ou Acteur, les chaînes de caractères à extraire sont les attributs de l’élément. On déclenche cette fois une fonction sur la balise ouvrante qui se charge de recopier le tableau des attributs dans $tab_film. Au moment de l’analyse du document, l’existence de ces méthodes sera détectée par debutElement() ou finElement(), héritées de la classe SAX ; elles seront donc automatiquement invoquées au moment approprié. Une dernière remarque : le constructeur de la classe SAXFilm initialise les données qui sont propres aux films. Il faut également appeler le constructeur de la super-classe SAX puisque ce dernier a en charge la création du parseur. Cet 8.3 Import de données XML dans MySQL 347 appel du constructeur des parents dans la hiérarchie de spécialisation n’est pas automatique en PHP. Voici pour finir le script associé au formulaire qui permet de transmettre un document XML pour l’insérer dans la base MySQL. La création d’un objet $filmXML, instance de la classe SAXFilm, permet d’analyser de manière complètement transpa- rente le contenu du document et de récupérer les valeurs décrivant un film 3 . Pour le contrôle des données et l’insertion dans la base, on fait appel aux fonctions du modèle implantées dans Film.php par extension de la classe TableBD. function import () { // Définition du titre $this−>vue−>titre_page = "Import de données XML"; // Contrôle de la session $this−>controleAcces() ; // Création du parseur pour les films $film_XML = new SAXFilm( "ISO−8859−1"); // Analyse du document if (! isSet ($_FILES [ ’ fichierXML ’ ]) ) { $this−>vue−>contenu = " Il faut indiquer un fichier XML <br />"; echo $this−>vue−>render("page") ; return ; } else { $film_XML−>parse ($_FILES [ ’fichierXML ’ ][ ’tmp_name ’ ]) ; } // On insère , si aucune erreur n’ est survenue if (!$film_XML−>erreurRencontree()) { $film = $film_XML−>getFilm(1) ; // On instancie le modèle "Film" (voir le contrôleur Saisie ) $tbl_film = new Film ($this−>bd) ; // On crée un objet à partir des données du tableau HTTP $tbl_film−>nouveau($film) ; // Contrôle des valeurs reçues $message = $tbl_film−>controle() ; // Vérification des valeurs récupérées dans le document if ($message) { 3. Ce code fonctionne également pour un document contenant plusieurs films, mais pour simplifier nous ne traitons que le premier film rencontré. . fonction xml_set_object() qui indique que le parseur est intégré à l’objet courant ($this) et que les déclencheurs sont des méthodes de cet objet. La méthode parse() est implantée de manière un. rencontré. Un objet d’une sous-classe de SAX en revanche doit explicitement fournir des méthodes de traitement des éléments, sinon il ne se passe rien. Les méthodes debutElement() et finElement(). type donné de document se résume maintenant à créer une sous-classe de SAX et à placer dans cette sous-classe des méthodes debutNom et finNom spécifiques aux noms d’éléments du type de document.

Ngày đăng: 06/07/2014, 00:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN