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. Pour y parvenir je vais m’appuyer sur l’API SimpleXML introduite avec PHP 5. Pour des traitements plus pointus, PHP 5 dispose d’une API DOM conforme aux standards niveau 2 de DOM. Je me concentre 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 dans MySQL. 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 \ _ i d 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 \ _ i d ) ); C’est une banale table contenant les noms et prénoms d’individus. Remplissez-la avec les données suivantes : INSERT (1 , INSERT (2 , INSERT (3 , INSERT (4 , INSERT (5 , INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u ’ H y a c i n t h e ’ , ’MENIET ’ ) ; INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u ’ W i l l i a m ’ , ’HEWLETT’ ) ; INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u ’ David ’ , ’PACKARD’ ) ; INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u ’ S c o t t ’ , ’MCNEALY’ ) ; INTO ‘ i n d i v i d u ‘ ( ‘ i n d i v i d u ’ Andy ’ , ’BECHTOLSHEIM ’ ) ; \ _ i d ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES \ _ i d ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES \ _ i d ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES \ _ i d ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES \ _ i d ‘ , ‘ prenom ‘ , ‘nom ‘ ) VALUES

1

3. Créer un objet SimpleXMLElement
Vous pouvez créer un objet SimpleXMLElement à partir d’une chaîne de caractère. Vous pouvez la soumettre directement ou la construire à partir de données contenues dans la base de données : \ $ x m l s t r = ’ <? xml v e r s i o n = " 1 . 0 " e n c o d i n g =" i s o −8859 −1"? > ’." $ \ backslash$n " . ’ < individus > ’." $ \ backslash$n "; \ $db = mysql \ _ c o n n e c t ( ’ l o c a l h o s t ’ , ’ l o g i n ’ , ’mdp ’ ) ; mysql \ _ s e l e c t \ _db ( ’ m y t e s t ’ , \ $db ) ; \ $ i n d R e q = ’SELECT i n d i v i d u \ _ i d , prenom , nom FROM i n d i v i d u ’ ; \ $ i n d R e s u l t = mysql \ _ q u e r y ( \ $ i n d R e q ) ; w h i l e ( \ $ i n d = 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 = " ’ . \ $ i n d −> i n d i v i d u \ _ i d . ’ " > ’ . ’ < prenom > ’ . h t m l e n t i t i e s ( \ $ i n d −>prenom ) . ’ < / prenom > ’ . ’ < nom > ’ . h t m l e n t i t i e s ( \ $ i n d −>nom ) . ’ < / nom> </ i n d i v i d u > ’ . " $ \ backslash$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 = simplexml \ _load \ _ s t r i n g ( \ $xmlstr ) ; L’objet « individus » est de type SimpleXMLElement et contient votre fichier XML. Vous pouvez 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 objet SimpleXMLElement à 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 i m p l e x m l \ _ l o a d \ _ 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’afficher ainsi : h e a d e r ( " C o n t e n t −t y p e : t e x t / xml " ) ; e c h o \ $ 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 : e c h o \ $ 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

e c h o \ $ i n d i v i d u s −> i n d i v i d u [ 2 ] [ ’ i d ’ ] ; 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 a s \ $ c o u r a n t ) \ { e c h o \ $ c o u r a n 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 ( ’ H e l l o ’ ) ; \ $ i n d i v i d u s −> i n d i v i d u [ 2 ] [ ’ i d ’ ] = 1 0 ; Vous pouvez même créer de nouveaux champs et de nouveaux attributs. Cependant avec SimpleXML je vous conseille de vous restreindre aux attributs. Pour les champs utilisez DOM. Ajoutez 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 ] [ ’ a n c i e n ’ ] = ’ W i l l i a m ’ ;

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 −>x p a t h ( ’ / 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 a s \ $prenom ) \ { e c h o \ $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écialiser SimpleXMLElement de façon à l’adapter au mieux à votre fichier XML. Créez le la classe MyXMLElement (renommez le fichier en .php) ainsi : c l a s s MyXMLElement e x t e n d s SimpleXMLElement { function listePrenoms () { r e t u r n $ t h i s −>x p a t h ( ’ / 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 dans individus.xml, vous pouvez instancier un nouvel objet s’appuyant sur cette classe ainsi :

3

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 i m p l e x m l \ _ l o a d \ _ 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 a s \ $prenom ) \ { e c h o \ $prenom . ’ < br > ’ ; \}

5.3 Utiliser XSLT PHP 5 est livré avec la classe XSLTProcessor qui permet de travailler de manière simplifié avec XSLT. Nous allons transformer notre XML en un fichier HTML. Je fournis un fichier XSL 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 X S L T P r o c e s s or ( ) ; \ $ x s l t −> i m p o r t S t y l e s h e e t ( DOMDocument : : l o a d ( ’ i n d i v i d u s . x s l ’ ) ) ; \ $ h t m l = \ $ x s l t −>t r a n s f o r m T o D o c ( \ $ i n d i v i d u s ) ; \ $html −> f o r m a t O u t p u t = t r u e ; e c h o \ $html −>saveXML ( ) ; Ceux qui connaissent l’API DOM ont remarqué que j’utilise cette dernière et non SimpleXML. En effet la ligne : \ $ h t m l = \ $ x s l t −>t r a n s f o r m T o D o c ( \ $ i n d i v i d u s ) ; Convertit l’objet « individus » de type SimpleXMLElement en un objet « html » de type DOMDocument.

4