PHP et XML XML et PHP 1 Traitements de XML Deux approches pour manipuler des documents XML: Approche DOM: Utilise un analyseur (Parser) qui transforme le document XML en structure d'arbre. Il faut parcourir cet arbre grâce à des méthodes de l'api DOM. Approche SAX : Considère un document XML comme suite d'éléments qui génèrent des événements pour lesquels il faut programmer des actions qui les traite. Les événements correspondent à : début d'un élément, fin d'un élément, etc. PHP a introduit une troisième appelée SimpleXML XML et PHP 2 1 1
Approche SAX Utilise un objet Parser créé avec la méthode xml_parser_create(): $parseur= xml_parser_create(); On doit programmer des méthodes (Gestionnaire ou Callback) pour traiter chacun des événements. Pour chaque partie d un élément XML, SAX génère un événement spécifique: Événement du début d'élément (ex. <employe>) Événement de la fin d'élément (ex. ) Événement pour le contenu (ex. <nom> Bernard </nom>) XML et PHP 3 Gestionnaires d'événements On associe un gestionnaire à un événement avec xml_set_element_handler() et xml_set_character_data_handler(). xml_set_element_handler() : associe un gestionnaire aux événements de début et de fin d'un élément. Paramètres: Parseur créé, gestionnaire pour le début de l'élément, gestionnaire pour la fin de l' élément. xml_set_character_data_handler() : permet de désigner le gestionnaire qui doit traiter le contenu d'un élément. XML et PHP 4 2 2
Gestionnaires d'événements Exemple : xml_set_element_handler($parseur,"debut","fin"); Désigne debut() et fin() comme gestionnaires de début d'élément et de fin d'élément respectivement. xml_set_character_data_handler($parseur,"contenu"); désigne contenu() comme gestionnaire du contenu. Fonction debut(): Paramètres: parseur, nom de l'élément, tableau de ses attributs. Fonction fin() : Paramètres: parseur, le nom de l'élément. Fonction contenu(): Paramètres: parseur, contenu de l'élément. XML et PHP 5 Gestionnaires d'événements <emplye Id="EMP12345"> <nom> Alain </nom> <salaire> 60000 </salaire> function debut($parseur, $nom, $attributs) { print "On a rencontre le debut de l'element: $nom. " print "Ses attributs sont: " foreach ($attributs as $valeur) { print "$valeur" function fin($parseur, $nom) { print ""On a rencontre la fin de l'element: $nom. "; function contenu($parseur,$donnees){ print "Le contenu de l'element est: $donnees. "; XML et PHP 6 3 3
Traitement SAX Le méthode xml-parse() permet d appeler le parseur et exécuter les gestionnaires. Avant d invoquer cette méthode, il faut lui fournir les données sur lesquelles il doit s exécuter. Ces données sont (généralement) dans un fichier XML. La méthode xml-parse() possède trois arguments: Parseur, fichier de données, condition d'arrêt. On libère le parseur à la fin avec xml_parser_free(). XML et PHP 7 <! Fichier : xml1.php --> <?php $parseur=xml_parser_create(); function debut($parseur, $nom, $attributs) { print "L'element : ". $nom."<br/>"; print "=> Attributs:"."<br />"; foreach($attributs as $valeur) { print "$valeur"."<br />"; function fin($parseur,$nom) { print "Fin de :". $nom."<br />"; function contenu($parser,$donnee) { print "=> Contenu: ". $donnee."<br />"; Traitement SAX xml_set_element_handler($parseur,"debut","fin"); xml_set_character_data_handler($parseur,"contenu"); $fp=fopen("employe.xml","r"); $fichier=fread($fp,sizeof($fp)); xml_parse($parseur,$fichier, feof($fichier)) ; xml_parser_free($parseur);?> <employes> <employe id="id1234"> <nom>alain</nom> <salaire>60000</salaire> <employe id="id1235"> <nom>jean</nom> <salaire>80000</salaire> <employe id="id1236"> <nom>michel</nom> employe.xm <salaire>90000</salaire> </employes> XML et PHP 8 4 4
Traitement SAX On peut lire les données à partir d'une chaine de caractères. Ca évite l'étape de lecture <?php <! Fichier: xml2.php --> xml_set_element_handler($parseur,"debut","fin"); xml_set_character_data_handler($parseur,"contenu"); $chaine="<employe id='id1234'> <nom>alain</nom> <salaire>60000</salaire> "; xml_parse($parseur,$chaine,true) ; xml_parser_free($parseur);?> XML et PHP 9 Messages d'erreurs La méthode xml_get_error_code() retourne une code d'erreur XML. La méthode xml_error_string() convertit un code d erreurs en un texte descriptif. La méthode exit("message d'erreur") permet de terminer un programme. Avec xml_error_string() et xml_get_error_code, elles permettent d afficher une message de terminaison approprié. <!-- Fichier: xml2.php --> <?php xml_set_element_handler($parseur,"debut","fin"); xml_set_character_data_handler($parseur,"contenu"); $chaine="<employe id='id1234'> <nom>alain<salaire>60000</salaire> "; if (!xml_parse($parseur,$chaine,true) ) exit(xml_error_string(xml_get_error_code($parseur))); xml_parser_free($parseur);?> Génère le message "Mismatched tag" XML et PHP 10 5 5
Approche DOM Commence d'abord par transformer le document XML en une structure d'arbre appelé Arbre DOM. Cet arbre est stockée en mémoire. On le parcourt à l'aide de méthodes appartenant à l'api DOM afin de le traiter. On doit créer cet arbre comme objet de la classe DOMDocument() XML et PHP 11 Parcours de l'arbre DOM On charge l'arbre avec la méthode load(). L'élément racine de l'arbre est l'objet documentelement Pour chaque nœud, on trouve ses enfants dans la propriété childnodes qui remmène un tableau des enfants du nœud courant: $racine=$xmldoc->documentelement; $enfants=$racine->childnodes; XML et PHP 12 6 6
Parcours de l'arbre DOM <! Fichier xml3.php --> <?php $xmldoc = new DOMDocument(); $xmldoc->load("employe.xml"); $racine=$xmldoc->documentelement; $enfants=$racine->childnodes; foreach ($enfants as $item) { print $item->nodename."=".$item->nodevalue. "<br/>";?> #text= employe= Alain 60000 #text= employe= Jean 80000 #text= employe= Michel 90000 #text= <employes> <employe id="id1234"> <nom>alain</nom> <salaire>60000</salaire> <employe id="id1235"> <nom>jean</nom> <salaire>80000</salaire> <employe id="id1236"> <nom>michel</nom> <salaire>90000</salaire> </employes> XML et PHP 13 Parcours de l'arbre DOM Exemple <?php $dom = new DomDocument(); $dom->load('test2.xml'); $root = $dom->documentelement; process_children($root); function process_children($node) { $children = $node->childnodes; foreach ($children as $elem) { if ($elem->nodetype == XML_ELEMENT_NODE) { if ($elem->nodename == 'body') { echo $elem->getattributenode('background')->value. "\n"; process_children($elem);?> Source :?? XML et PHP 14 7 7
Approche SimpleXML SimpleXML est introduit dans PHP 5. Traitement facilité et rapide de documents XML Convertit un document XML en objet: Les éléments sont convertis en attributs d'un objet SimpleXMLElement. Les attributs sont accessibles avec des tableaux associatifs dont les clés sont les noms des attributs Les contenus des élémenst sont convertis en chaines de caractères. XML et PHP 15 Traitement SimpleXML En général, on suit les étapes suivants: Lire le fichier XML On obtient le premier élément Obtenir le nom du premier élément avec la méthode getname() Boucler sur chaque enfant de l'élément en utilisant la fonction children() Imprimer le nom (obtenu avec getname()) et les données de cet enfant XML et PHP 16 8 8
Traitement SimpleXML <!-- Fichier: xml4.php --> <?php $xml = simplexml_load_file("employe.xml"); echo $xml->getname(). "<br/>"; foreach($xml->children() as $child) { echo $child->getname().":".$child. "<br/>";?> Source: http://www.w3schools.com/php/php_xml_simplexml.asp XML et PHP 17 Espaces de nom Ensembles permettant de qualifier des éléments et des attributs avec un URI Identifient le domaine de définition d'un objet. Utilisation de préfixe de qualification Les éléments de l'espace utilisent ce préfixe <nl:livre xmlns:nl="http://www.info.uqam.ca/exemplesxml"> <nl:titre> Programmation des reseaux </nl:titre> <nl:auteur> Abdel Obaid </nl:auteur> <nl:editeur> Loze-Dion </nl:editeur> <nl:annee >2003 </nl:annee> </nl:livre> XML et PHP 18 9 9
Les schémas Structure d'un document XML. Document XML, standard w3c: Eléments définis par un modèle de contenu Structure hiérarchique de types (simples, complexes, ) L attribut schemalocation fait le lien entre le document XML et le schéma. <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> XML et PHP 19 Espaces de noms par défaut targetnamaspace permet de définir un espace de noms pour les données non préfixées. <?xml version="1.0"?> <xs:schema xmlns:xs= http://www.w3.org/2001/xmlschema targetnamespace= http://www.info.uqam.ca/espacedenoms > <xs:element name="livre"> <xs:complextype> <xs:sequence> <xs:element name="titre" type="xs:string"/> <xs:element name="auteur" type="xs:string"/> <xs:element name="editeur" type="xs:string"/> <xs:element name="annee" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> </xs:schema> XML et PHP 20 10 10
Exemple <?xml version="1.0"?> <xs:schema xmlns:xs= http://www.w3.org/2001/xmlschema targetnamespace= http://www.info.uqam.ca/espacedenoms elementformdefault="qualified" attributeformdefault="qualified"> <xs:element name="librairie"> <xs:complextype> <xs:sequence> <xs:element ref="livre" minoccurs="1" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="livre"> <xs:complextype> <xs:sequence> <xs:element name="titre" type="xs:string" /> <xs:element name="auteur" type="xs:string" /> <xs:element name="editeur" type="xs:string" /> <xs:element name="annee" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> </xs:schema> XML et PHP 21 XSL XSL (extensible Stylesheet Language) permet de définir des styles d'affichage de documents XML. Permet de transformer des documents XML en XHTML. Contient trois compsantes: XSLT: Transformation de documents XML XPath: Extraction de parties de documents XML et PHP 22 11 11
Feuilles de style XSL Règles à appliquer à chaque noeud dans lequel une valeur est rencontrée. La balise <xsl:stylesheet> donne le début de la définition de la feuille de style. Élemenst de XSL: <xsl:value-of />: Valeur d'un nœud. <xsl:for-each> </xsl:for-each>: Chaque élément d'un ensemble d'éléments d'un nœud. <xsl:if test="condition" >: Élément quui satisfait le condition <xsl:choose>: Choix entre élements : XML et PHP 23 Un exemple de XSL <?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <body> <table border="1"> <tr bgcolor="#9acd32"> <th align="left"> Title</th> <th align="left"> Artist</th> </tr> <xsl:for-each select="catalogue/cd"> <tr> <td> <xsl:value-of select="titre"/> </td> <td> <xsl:value-of select="artiste"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> XML et PHP 24 12 12
XPATH Ensemble de règles pour extraire des parties d'un document XML Utilise des expressions de chemin (Path expressions) pour localiser des nœuds d'un document XML. Le document étant considéré comme un arbre Des expressions sont décrites à l'aide de patterns, des conditions et des fonctions des sélection XML et PHP 25 13 13