Valid XHTML     Valid CSS2    

XML via PHP

PHP dispose de nombreuses librairies pour accéder aux fichiers XML et les traiter. La page de référence du manuel PHP est ici. Nous fournissons ci-dessous quelques exemples d'utilisation.

Afin de pouvoir reproduire ces exemples, le code-source PHP de cette page est ici.

1. Utilisation de SimpleXML

On peut créer un objet XML à partir du constructeur de la classe SimpleXMLElement. Il faut obligatoirement fournir un paramètre qui est une chaine de caractères correspondant à du code XML bien formé.

On peut aussi définir un objet XML via la fonction implexml_load_string().

La lecture d'un fichier XML peut se faire avec la fonction simplexml_load_file().

L'objet retourné est de classe SimpleXMLElement, comme l'indique la fonction get_class().

Pour afficher du code XML, on peut se contenter d'appeler la méthode asXML().

Voici un mini-exemple de code PHP correspondant, qui utilise le fichier mini.xml.

Fichier mini.xml


     <?xml version="1.0" ?>
     <miniExemple xmp="minimaliste">
     Ceci est le texte de miniExemple.
     </miniExemple>
     

Fichier mini01.php


     <?php
     
     # 1. Création d'un objet XML
     
     $elt = new SimpleXMLElement("<exemple>\nVide !\n</exemple>\n") ;
     echo "Un élément créé par SimpleXMLElement a pour classe : " .get_class($elt)."\n" ;
     echo "Contenu d'un tel objet via la méthode asXML() :\n" ;
     echo $elt->asXML() ." \n" ;
     
     # 2. Lecture d'un fichier XML
     
     $mini1 = simplexml_load_file("mini.xml") ;
     echo "Lecture OK via la fonction simplexml_load_file(). Contenu : \n" ;
     echo $mini1->asXML() ." \n" ;
     
     # 3. Lecture d'une chaine XML
     
     $mini2 =  new SimpleXMLElement(file_get_contents("mini.xml")) ;
     echo "Création OK via le constructeur. Contenu : \n" ;
     echo $mini2->asXML() ." \n" ;
     
     ?>
     

Résultats d'exécution


     Un élément créé par SimpleXMLElement a pour classe : SimpleXMLElement
     Contenu d'un tel objet via la méthode asXML() :
     <?xml version="1.0"?>
     <exemple>
     Vide !
     </exemple>
     
     Lecture OK via la fonction simplexml_load_file(). Contenu :
     <?xml version="1.0"?>
     <miniExemple xmp="minimaliste">
     Ceci est le texte de miniExemple.
     </miniExemple>
     
     Création OK via le constructeur. Contenu :
     <?xml version="1.0"?>
     <miniExemple xmp="minimaliste">
     Ceci est le texte de miniExemple.
     </miniExemple>
     
     

Pour parcourir les éléments d'un document XML, la méthode xpath() renvoie un tableau d'éléments pour lequel l'itération via foreach est possible.

La liste des méthodes de la classe SimpleXML est ici.

2. Utilisation de l'API standard nommée DOM

Pour "servir" (produire du coté serveur) du XML, il faut commencer par émettre le bon header, soit le code header('Content-type: text/xml').

On crée un élément via le constructeur de la classe. On peut fournir un paramètre de numéro de version de XML et un paramètre pour l'encodage.

On crée des éléments via les méthodes createElement() et createTextNode(). Pour les attributs, on dispose des méthodes createAttribute(), getAttribute() et setAttribute().

Enfin, on ajoute les éléments à l'aide la méthode appendChild()

Voici un exemple de code PHP qui utilise DOM :

Fichier mini02.php


     <?php
     error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
     header('Content-type: text/xml') ;
     
     $xmlDct  = new DOMDocument('1.0','UTF-8') ;
     
     $rootElt = $xmlDct->createElement("personnes") ;
     $tmp     = $xmlDct->appendChild($rootElt)      ;
     
     # personne 1
     
     $p1      = $xmlDct->createElement("personne")  ;
     
     $n1      = $xmlDct->createElement("nom")       ;
     $t1      = $xmlDct->createTextNode("ZOLA")     ;
     $tmp     = $n1->appendChild($t1)               ;
     $tmp     = $p1->appendChild($n1)               ;
     
     $n2      = $xmlDct->createElement("prenom")    ;
     $t2      = $xmlDct->createTextNode("Emile")    ;
     $tmp     = $n2->appendChild($t2)               ;
     $tmp     = $p1->appendChild($n2)               ;
     
     $tmp     = $rootElt->appendChild($p1)          ;
     
     # personne 2
     
     $p2      = $xmlDct->createElement("personne")  ;
     
     $n3      = $xmlDct->createElement("nom")       ;
     $t3      = $xmlDct->createTextNode("BOND")     ;
     $tmp     = $n3->appendChild($t3)               ;
     $tmp     = $p2->appendChild($n3)               ;
     
     $n4      = $xmlDct->createElement("prenom")    ;
     $t4      = $xmlDct->createTextNode("James")    ;
     $tmp     = $n4->appendChild($t4)               ;
     $tmp     = $p2->appendChild($n4)               ;
     
     $tmp     = $rootElt->appendChild($p2)          ;
     
     echo $xmlDct->saveXML() ;
     ?>
     

Pour tester la génération, il suffit de cliquer sur ce lien.

On obtient alors le texte XML suivant (sans le formatage) :


     <?xml version="1.0" encoding="UTF-8"?>
     <personnes>
     
        <personne>
           <nom>ZOLA</nom>
           <prenom>Emile</prenom>
        </personne>
     
        <personne>
           <nom>BOND</nom>
           <prenom>James</prenom>
        </personne>
     
     </personnes>
     

La liste des méthodes de la classe DOMDocument est ici.

3. Exemple de recherche XPATH avec PHP

Pour un fichier comme ci-dessous :


         <Table>
             <Champs>
                 <Donnee NomColonne="id"     Type="IDS"       Prefixe="MAT" NbChiffres="4"     />
                 <Donnee NomColonne="poids"  Type="Numerique" Min="30" Max="250" Null="1"  />
             </Champs>
     
             <Parametres>
                 <NomTable nom="minimal_id_poids"/>
                 <Sortie   XML="oui" CSV="oui" SQL="oui" />
                 <NbLigne  valeur="10"/>
                 <Graine   valeur="123" />
             </Parametres>
         </Table>
     
     

on veut récupérer les valeurs de Nbligne, de NbChiffres...

On pourrait, une fois le document chargé en mémoire, écrire du code comme


     <?php
     
     ##################################################################################################################
     #
     #  XPATH en PHP
     #
     ##################################################################################################################
     
     # exemple 1 de code :
     
     
         $listeRows = $table->getElementsByTagName("NbLigne") ;
     
         // variable incrementée permettant l'identification pour IDS (genererIDS.php) pour chaque table
     
         $compteurPassage = 0 ;
         $nbligne = 0 ;
     
         foreach ($listeRows as $rows) {
     
             if ($rows->hasAttribute("valeur")) {
                 $nbligne = $rows->getAttribute("valeur") ; //on recupère le nombre de ligne a générer
             } # fin si
     
         } # fin pour
     
     # exemple 2 de code :
     
                      $nbChiffres = 3 ;
                      if ($dataLigne->hasAttribute("NbChiffres")) {
                          $nbChiffres = $dataLigne->getAttribute("NbChiffres") ;
                      } ; # fin si
     
     # exemple 3 de code :
     
                      if ($data->hasAttribute("Suffixe")) {
                          $Suffixe = $data->getAttribute("Suffixe");
                      } else {
                          $Suffixe = 0 ;
                      } ; # fin si
     
     ##################################################################################################################
     ?>
     

Mais il est beaucoup plus propre de faire une petite fonction, comme souvent en PHP :


     <?php
     
     ##################################################################################################################
     
     function valeurAttribut($element,$nomAttribut,$parDefaut="") {
     
     ##################################################################################################################
     
     #  le code précédent peut &ecirc;tre avantageusement remplacé par
     #
     #  $nbligne    = valeurAttribut($data,"Nbligne",0) ;
     #  $nbChiffres = valeurAttribut($dataLigne,"NbChiffres",3) ;
     #  $suffixe    = valeurAttribut($data,"Suffixe",0) ;
     #
     ##################################################################################################################
     
     $attrib = $parDefaut ;
     
     if ($element->hasAttribute($nomAttribut)) {
        $attrib  = $element->getAttribute($nomAttribut) ;
     } # fin si
     
     return $attrib ;
     
     } # fin de fonction valeurAttribut
     
     ?>
     

 

 

retour gH    Retour à la page principale de   (gH)