1955 Pi`ege de cristal 1988 USA Action McClane Pulp fiction 1994 USA Action Butch Coolidge Cette fois, en supposant que le point d’accès est toujours un acteur, on a toutes les inf
Trang 1<annee_naissance>1955</annee_naissance>
<Film>
<titre>Pi`ege de cristal</titre>
<annee>1988</annee>
<code_pays>USA</code_pays>
<genre>Action</genre>
<nom_role>McClane</nom_role>
</Film>
<Film>
<titre>Pulp fiction</titre>
<annee>1994</annee>
<code_pays>USA</code_pays>
<genre>Action</genre>
<nom_role>Butch Coolidge</nom_role>
</Film>
</Acteur>
</Acteurs>
Cette fois, en supposant que le point d’accès est toujours un acteur, on a toutes les informations relatives à cet acteur dans le même sous-arbre, ce qui va permettre d’y accéder efficacement et simplement On voit en revanche que si on souhaite prendre comme point d’accès un film, les informations utiles sont réparties un peu partout dans l’arbre, et que leur reconstitution sera plus difficile.
La base de données que nous utilisons dans nos exemples est très simple Il est clair que pour des bases réalistes présentant quelques dizaines de tables, la conception d’un schéma XML d’exportation doit faire des compromis entre l’imbrication des données
et la conservation des correspondances clé primaire/clé étrangère sous forme de lien
de navigation dans le document XML Tout dépend alors des besoins de l’application,
de la partie de la base qu’il faut exporter, et des chemins d’accès privilégiés aux informations qui seront utilisés dans l’exploitation du document.
8.2.2 Application avec PHP
La transformation d’une table MySQL en document XML est extrêmement simple puisqu’il suffit de créer une chaîne de caractères au format approprié Une approche directe mais fastidieuse consiste à agir au cas par cas en engendrant « à la main » les balises ouvrante et fermante et leur contenu Comme toujours il faut essayer d’être le plus générique possible : la fonction présentée ci-dessous prend un tableau
associatif contenant une liste (nom, valeur ) et crée une chaîne XML Cette chaîne
est un élément dont le nom est passé en paramètre (si la chaîne vide est passée pour le nom, seul le contenu de l’élément, sans les balises ouvrante et fermante, est renvoyé).
Trang 2REMARQUE –Il faut, comme en HTML, être attentif à éviter d’introduire des caractères réservés comme <, >, ’, " ou & dans les contenus XML Le traitement par la fonction htmlSpecialChars()qui remplace ces caractères en appels d’entités convient parfaite-ment
L’élément créé est précédé de tabulations afin de faciliter une mise en forme claire
du document final, comme nous le montrerons plus loin Enfin la représentation
du tableau peut, au choix, reposer sur des attributs ou des éléments Voici le code
de la fonction, qui est techniquement une méthode statique de la classe utilitaire EchangeXML.
s t a t i c f u n c t i o n t a b l e a u V e r s X M L ( $ t a b l e a u = a r r a y ( ) ,
$nom_element= " l i g n e " , $ n b _ t a b =0 , $ f o r m a t = s e l f : : ELEMENTS) {
/ / C r é a t i o n d ’ u n e c h a î n e a v e c l e n o m b r e $ n b _ t a b d e
/ / t a b u l a t i o n s
$ t a b s = " " ;
f o r ( $ i = 0 ; $ i < $ n b _ t a b ; $ i ++) $ t a b s = " \ t " ;
$chaine_XML = $ a t t r s = " " ;
/ / M i s e e n f o r m e e n f o n c t i o n du f o r m a t d e m a n d é
i f ( $ f o r m a t == s e l f : : ELEMENTS) {
/ / On c r é e s i m p l e m e n t un é l é m e n t XML p o u r c h a q u e a t t r i b u t / / d e l a t a b l e , e t on c o n c a t è n e l e s é l é m e n t s
f o r e a c h ( $ t a b l e a u a s $nom => $ v a l ) {
/ / On r e t i r e l e s r e t o u r s à l a l i g n e du r é s u m é
i f ( $nom == " r e s u m e " ) $ v a l = s t r _ r e p l a c e ( " \n " , " \n\ t " ,
$ v a l ) ;
/ / On p l a c e l ’ i d e n t i f i a n t comme un a t t r i b u t
i f ( $nom== " i d " ) $ a t t r s = " $nom = ’ $ v a l ’ " ;
/ / P o u r t o u s l e s a u t r e s on c r é e un é l é m e n t
i f ( $nom != " i d _ r e a l i s a t e u r " and $nom != " i d " and ! empty (
$ v a l ) ) {
$chaine_XML = $chaine_XML $ t a b s " <$nom> " h t m l S p e c i a l C h a r s ( $ v a l ) " </$nom>\n " ; }
}
/ / La c h a î n e o b t e n u e e s t l e c o n t e n u d e l ’ é l é m e n t
$ n o m _ e l e m e n t
i f ( ! empty ( $nom_element ) ) {
$chaine_XML = " $ t a b s <$nom_element $ a t t r s >\
n$chaine_XML$tabs < / $nom_element >\n " ; }
}
e l s e {
/ / On c r é e un s e u l é l é m e n t a v e c d e s a t t r i b u t s XML
i f ( i s _ a r r a y ( $ t a b l e a u ) ) {
f o r e a c h ( $ t a b l e a u a s $nom => $ v a l ) {
$chaine_XML = " $nom=\" " h t m l S p e c i a l C h a r s ( $ v a l ) "
\" " ;
Trang 3} }
$chaine_XML = " $ t a b s <$nom_element $chaine_XML / >\n " ;
}
r e t u r n $chaine_XML ;
}
Les commentaires indiquent les étapes de cette conversion vers XML, qui ne pré-sente aucune difficulté conceptuelle Maintenant il devient très facile de transformer une base en document XML Notre outil d’export (voir la copie d’écran page 318) offre un formulaire permettant à l’utilisateur de saisir des critères de recherche pour des films de la base À partir de ces critères une requête est créée (on réemploie bien entendu la fonction Util::creerRequetes() déjà utilisée pour rechercher les films à noter), exécutée, et chaque film est mis sous la forme d’un élément XML auquel on ajoute le metteur en scène et les acteurs Voici le script complet de l’action export dans le contrôleur XML :
f u n c t i o n e x p o r t ( )
{
/ / P o u r c r é e r un f i c h i e r p a r f i l m
$ m u l t i _ f i l e s = f a l s e ;
/ / C r é a t i o n d e l a r e q u ê t e SQL e n f o n c t i o n d e s c r i t è r e s
$ r e q u e t e = U t i l : : c r e e r R e q u e t e s ( $_POST , $ t h i s−>bd ) ;
$ r e s u l t a t = $ t h i s−>bd−>execRequete ( $ r e q u e t e ) ;
/ / On p a r c o u r t l e s f i l m s e t on l e s t r a n s f o r m e e n XML
$document = " " ;
$ n b F i l m s = 0 ;
w h i l e ( $ f i l m = $ t h i s−>bd−>l i g n e S u i v a n t e ( $ r e s u l t a t ) ) {
/ / M i s e e n f o r m e du f i l m
$film_XML = EchangeXML : : t a b l e a u V e r s X M L ( $ f i l m , " " ) ;
/ / M i s e e n f o r m e du m e t t e u r e n s c è n e
$mes = U t i l : : c h e r c h e A r t i s t e A v e c I D ( $ f i l m [ ’ i d _ r e a l i s a t e u r ’ ] ,
$ t h i s−>bd , FORMAT_TABLEAU) ;
$film_XML = EchangeXML : : t a b l e a u V e r s X M L ( $mes , " r e a l i s a t e u r " ,
1 , EchangeXML : : ELEMENTS) ;
/ / A j o u t d e s a c t e u r s e t d e l e u r r ô l e
$ r e q _ a c t e u r s = " SELECT i d , prenom , nom , a n n e e _ n a i s s a n c e ,
n o m _ r o l e "
"FROM A r t i s t e A, R o l e R "
"WHERE A i d = R i d _ a c t e u r AND R i d _ f i l m = ’ { $ f i l m [ ’ i d ’ ] } ’ " ;
$ r e s _ a c t e u r s = $ t h i s−>bd−>execRequete ( $ r e q _ a c t e u r s ) ;
w h i l e ( $ r o l e = $ t h i s−>bd−>l i g n e S u i v a n t e ( $ r e s _ a c t e u r s ) ) {
$film_XML = EchangeXML : : t a b l e a u V e r s X M L ( $ r o l e , " A c t e u r " ,
1 , EchangeXML : : ELEMENTS) ;
Trang 4/ / On p l a c e l e c o n t e n u d a n s l a b a l i s e < F i l m >
$document = " <Film >\n " $film_XML " \n </ Film >\n " ;
$ n b F i l m s ++;
}
/ / On e n v o i e l ’ en−t ê t e HTTP, e t l e p r o l o g u e du document XML
Header ( " Content−t y p e : t e x t / xml " ) ;
echo " <? xml v e r s i o n = \ " 1 0 \ " e n c o d i n g =\" i s o−8859−1\"?>\n\n " ; / / M i s e e n f o r m e s e l o n l e c h o i x d e l ’ u t i l i s a t e u r
i f ( $_POST [ ’ f o r m a t ’ ] == "XML" ) {
/ / On s o r t l e XML b r u t
echo " < F i l m s >\n$document < / F i l m s >\n " ; ;
}
e l s e {
/ / On a p p l i q u e u n e t r a n s f o r m a t i o n XSLT I l s u f f i t d ’ a j o u t e r / / u n e i n s t r u c t i o n p o u r q u e l e n a v i g a t e u r e n t i e n n e c o m p t e / / e t a p p l i q u e l a t r a n s f o r m a t i o n F i l m x s l
echo " <? xml−s t y l e s h e e t h r e f = ’ / x s l / Film x s l ’ t y p e = ’ t e x t / x s l
’? >\ n "
" < F i l m s >\n$document < / F i l m s >\n " ; ; }
}
Quand le format choisi est XML, le document renvoyé est déclaré de type MIME text/xml pour qu’il soit affiché sous une forme présentable dans le navigateur.
En jouant sur le type MIME on pourrait également forcer le téléchargement du document sur la machine du client application/force-download) Si on choisit
le format HTML, le même document est transmis, mais avec une instruction de traitement qui demande au navigateur d’appliquer une transformation XSLT Nous y revenons en fin de chapitre, page 348.
Vous pouvez directement utiliser ce script sur notre site pour récupérer un ou
plusieurs films en XML Voici par exemple le résultat obtenu pour Kill Bill.
Exemple 8.10 KillBill.xml: Exemple de document produit par le script précédent
<?xml version="1.0" encoding="ISO-8859-1"?>
<Films>
<Film>
<titre>Kill Bill</titre>
<annee>2003</annee>
<code_pays>USA</code_pays>
<genre>Drame</genre>
<resume>Au cours d’une c´er´emonie de mariage en plein d´esert, un commando fait irruption dans la chapelle et tire sur les convives Laiss´ee pour morte, la Mari´ee enceinte retrouve ses esprits apr`es un coma de quatre ans Celle qui a auparavant exerc´e les fonctions de tueuse `a gages au sein du D´etachement International des Vip`eres Assassines n’a alors plus qu’une
Trang 5seule id´ee en t^ete : venger la mort de ses proches en ´eliminant tous les membres de l’organisation criminelle, dont leur chef Bill qu’elle se r´eserve pour la fin.</resume>
<Realisateur
nom="Tarantino"
prenom="Quentin"
annee_naissance="1963" />
<Acteur
prenom="Uma"
nom="Thurman"
annee_naissance="1970"
nom_role="La mari´ee, alias "Black Mamba"" />
<Acteur
prenom="Lucy"
nom="Liu"
annee_naissance="1968"
nom_role="O-Ren Ishii" />
<Acteur
prenom="David"
nom="Carradine"
annee_naissance="1936"
nom_role="Bill" />
<Acteur
prenom="Michael"
nom="Madsen"
annee_naissance="1958"
nom_role="Budd / Sidewinder" />
<Acteur
prenom="Daryl"
nom="Hannah"
annee_naissance="1960"
nom_role="Elle Driver" />
</Film>
</Films>
8.3 IMPORT DE DONNÉES XML DANS MySQL
L’opération inverse, l’import d’un document XML dans une base de données MySQL, est un peu plus difficile Au lieu de s’appuyer sur SQL pour récupérer les données dans
la base, il faut utiliser un parseur de documents XML qui va analyser la structure du
document et permettre d’accéder à ses différents composants.
Les parseurs XML s’appuient sur deux modèles possibles de traitement d’un
document, connus respectivement sous les acronymes SAX (Simple API for XML)
et DOM (Document Object Model) Le modèle de traitement de SAX consiste à
parcourir le document linéairement, et à déclencher des fonctions à chaque fois qu’une des catégories syntaxiques (balises ouvrantes, fermantes, texte, instructions
de traitement, etc.) constituant un document XML est rencontrée.