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 ê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 à la page principale de (gH)