manipuler des fichiers xml en php

4

Click here to load reader

description

manipuler des fichiers xml en php

Transcript of manipuler des fichiers xml en php

Page 1: manipuler des fichiers xml en php

Manipuler du XML avec PHP5

Hyacinthe MENIET

27 juillet 2007

Je vais indiquer dans ce document, comment manipuler très facilement du XML avec PHP. Poury parvenir je vais m’appuyer sur l’API SimpleXML introduite avec PHP 5. Pour des traitementsplus pointus, PHP 5 dispose d’une API DOM conforme aux standards niveau 2 de DOM. Je meconcentre sur SimpleXML.

1. Pré-requis

– Vous êtes familier de PHP et de sa syntaxe objet.– Vous êtes familier de XML, notamment de XPath et XSLT.– Vous disposez d’un serveur Apache 1.3 minimum.– Vous disposez d’un serveur MySQL 4 minimum pour la partie SQL.– Vous disposez de PHP 5 minimum.

2. Initialisation des données

Dans la suite du document vous allez créer un fichier XML à partir de données contenues dansMySQL. Pour cela créez la table suivante :

CREATE TABLE i n d i v i d u (i n d i v i d u \ _ id INTEGER UNSIGNED NOT NULL AUTO\_INCREMENT,prenom VARCHAR( 4 5 ) NULL,nom VARCHAR( 2 0 ) NULL,PRIMARY KEY( i n d i v i d u \ _ id )) ;

C’est une banale table contenant les noms et prénoms d’individus. Remplissez-la avec les donnéessuivantes :

INSERT INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u \ _ id ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES( 1 , ’ Hyac in the ’ , ’MENIET ’ ) ;

INSERT INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u \ _ id ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES( 2 , ’ Wi l l iam ’ , ’HEWLETT’ ) ;

INSERT INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u \ _ id ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES( 3 , ’ David ’ , ’PACKARD’ ) ;

INSERT INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u \ _ id ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES( 4 , ’ Sco t t ’ , ’MCNEALY’ ) ;

INSERT INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u \ _ id ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES( 5 , ’Andy ’ , ’BECHTOLSHEIM’ ) ;

1

Page 2: manipuler des fichiers xml en php

3. Créer un objet SimpleXMLElement

Vous pouvez créer un objetSimpleXMLElement à partir d’une chaîne de caractère. Vous pou-vez la soumettre directement ou la construire à partir de données contenues dans la base de don-nées :

\ $ x m l s t r = ’ <?xml v e r s i o n = " 1 .0 " encod ing =" i so−8859−1"? > ’."$ \b a c k s l a s h $ n "

. ’ < i n d i v i d u s > ’ . " $ \ b a c k s l a s h $ n " ;\ $db = mysql \ _connec t ( ’ l o c a l h o s t ’ , ’ l og in ’ , ’mdp ’ ) ;mysql \ _ s e l e c t \ _db ( ’ mytes t ’ , \ $db ) ;\ $ indReq = ’SELECT i n d i v i d u \ _id , prenom , nom FROM i n d i v i d u ’ ;\ $ i n d R e s u l t = mysql \ _query ( \ $ indReq ) ;wh i l e ( \ $ ind = mysql \ _ f e t c h \ _ o b j e c t ( \ $ i n d R e s u l t ) ) \ {\ $ x m l s t r .= ’< i n d i v i d u i d = " ’ . \ $ ind−> i n d i v i d u \ _ id . ’ " > ’. ’ < prenom > ’ . h t m l e n t i t i e s ( \ $ ind−>prenom ) . ’ < / prenom > ’. ’ <nom > ’ . h t m l e n t i t i e s ( \ $ ind−>nom ) . ’ < / nom> </ i n d i v i d u > ’ . " $ \

b a c k s l a s h $ n " ;\ }\ $ x m l s t r .= ’ </ i n d i v i d u s > ’ . " $ \ b a c k s l a s h $ n " ;mysql \ _ c l o s e ( ) ;\ $ i n d i v i d u s = s implexml \ _ load \ _ s t r i n g ( \ $ x m l s t r ) ;

L’objet « individus »est de typeSimpleXMLElement et contient votre fichier XML. Vouspouvez le sauver dans un le fichier« copie.xml »grâce à la ligne suivante :

\ $ i n d i v i d u s−>asXML( ’ c o p i e . xml ’ ) ;

Si vous disposez déjà d’un fichier XML et que vous souhaitez juste instancier un objetSimpleXMLElementà partir de ce fichier, il suffit de faire :

i f ( ! f i l e \ _ e x i s t s ( ’ i n d i v i d u s . xml ’ ) ) \ {e x i t ( ’ I m p o s s i b l e de l i r e i n d i v i d u s . xml . ’ ) ;\ }\ $ i n d i v i d u s = s implexml \ _ load \ _ f i l e ( ’ i n d i v i d u s . xml ’ ) ;

4. Manipuler le XML

4.1 Afficher le fichier XML

A ce stade vous avez votre objet« individus »qui contient votre XML. Vous pouvez l’afficherainsi :

heade r ( " Content−t ype : t e x t / xml " ) ;echo \ $ i n d i v i d u s−>asXML ( ) ;

4.2 Accéder aux champs et attributs

Si vous souhaitez afficher le prénom du second individu :

echo \ $ i n d i v i d u s−> i n d i v i d u [1]−> prenom ;

Pour avoir la valeur de l’attribut« id »du troisième individu :

2

Page 3: manipuler des fichiers xml en php

echo \ $ i n d i v i d u s−> i n d i v i d u [ 2 ] [ ’ id ’ ] ;

Pour afficher tous les noms :

f o r e a c h ( \ $ i n d i v i d u s−> i n d i v i d u as \ $ c o u r a n t ) \ {echo \ $couran t−>nom. ’ < br > ’ ;\ }

4.3 Modifier des champs et attributs

Aussi aisément que vous avez affiché champs et attributs vous pouvez les modifier :

\ $ i n d i v i d u s−> i n d i v i d u [1]−> prenom = h t m l e n t i t i e s ( ’ Hel lo ’ ) ;\ $ i n d i v i d u s−> i n d i v i d u [ 2 ] [ ’ id ’ ] = 10 ;

Vous pouvez même créer de nouveaux champs et de nouveaux attributs. Cependant avec Sim-pleXML je vous conseille de vous restreindre aux attributs. Pour les champs utilisez DOM. Ajou-tez un attribut« ancien »au second individu se résume à :

\ $ i n d i v i d u s−> i n d i v i d u [ 2 ] [ ’ anc ien ’ ] = ’ Wi l l iam ’ ;

5. Utilisation avancée

5.1 Utiliser Xpath

Xpath est à XML ce que SQL est aux bases de données. Toute proportion gardée bien-sûr. C’est àdire qu’il vous permet d’interroger un document XML et de n’extraire que certaines informations.Pour avoir tous les prénoms :

\ $prenoms = \ $ i n d i v i d u s−>xpa th ( ’ / i n d i v i d u s / i n d i v i d u / prenom ’ ) ;f o r e a c h ( \ $prenoms as \ $prenom ) \ {echo \ $prenom . ’ < br > ’ ;\ }

5.2 Etendre SimpleXMLElement

Comme tout langage orienté objet qui se respecte, PHP autorise la spécialisation d’une classe.Vous pouvez donc spécialiserSimpleXMLElement de façon à l’adapter au mieux à votre fichierXML. Créez le la classeMyXMLElement (renommez le fichier en .php) ainsi :

c l a s s MyXMLElement e x t e n d s SimpleXMLElement {f u n c t i o n l i s t e P r e n o m s ( ) {r e t u r n $ t h i s−>xpa th ( ’ / i n d i v i d u s / i n d i v i d u / prenom ’ ) ;}}

Cette classe se contente de définir une méthode« listePrenoms »qui retourne la liste des prénoms.En supposant que vous ayez sauvegardé votre fichier XML dansindividus.xml, vous pouvez ins-tancier un nouvel objet s’appuyant sur cette classe ainsi :

3

Page 4: manipuler des fichiers xml en php

i n c l u d e ( ’ MyXMLElement . php ’ ) ;i f ( ! f i l e \ _ e x i s t s ( ’ i n d i v i d u s . xml ’ ) ) \ {e x i t ( ’ I m p o s s i b l e de l i r e i n d i v i d u s . xml . ’ ) ;\ }\ $ s p e c i a l = s implexml \ _ load \ _ f i l e ( ’ i n d i v i d u s . xml ’ , ’ MyXMLElement ’ )

;

Et vous pouvez jouer avec :

\ $prenoms = \ $ s p e c i a l−> l i s t e P r e n o m s ( ) ;f o r e a c h ( \ $prenoms as \ $prenom ) \ {echo \ $prenom . ’ < br > ’ ;\ }

5.3 Utiliser XSLT

PHP 5 est livré avec la classe XSLTProcessor qui permet de travailler de manière simplifié avecXSLT. Nous allons transformer notre XML en un fichier HTML. Je fournis un fichierXSL pourça, mais rien ne vous empêche de faire le votre.Il ne vous reste plus qu’à générer le HTML :

\ $ x s l t = new XSLTProcessor ( ) ;\ $ x s l t−> i m p o r t S t y l e s h e e t ( DOMDocument : : l oad ( ’ i n d i v i d u s . xs l ’ ) ) ;\ $html = \ $ x s l t−>t ransformToDoc ( \ $ i n d i v i d u s ) ;\ $html−>fo rma tOu tpu t = t r u e ;echo \ $html−>saveXML ( ) ;

Ceux qui connaissent l’API DOM ont remarqué que j’utilise cette dernière et non SimpleXML.En effet la ligne :

\ $html = \ $ x s l t−>t ransformToDoc ( \ $ i n d i v i d u s ) ;

Convertit l’objet « individus »de typeSimpleXMLElement en un objet« html » de typeDOMDocument.

4