C-Stan, Création de solutions web, Ingéniérie informatique

Création de solutions web, Ingéniérie informatique

C-Stan, Création de solutions web, Ingéniérie informatique
Accueil > Blog > Le coin des développeurs > Parser un fichier XML vers un tableau PHP ou une table MySQL
 
Parser un fichier XML vers un tableau PHP ou une table MySQL

Parser un fichier XML vers un tableau PHP ou une table MySQL

12 février 2010

L’utilisation d’un fichier XML en PHP nécessite souvent des librairies externes ou des algorythmes complexes. Ici nous vous proposons deux fonctions simples pour transformer votre fichier XML en tableau associatif PHP puis en requête MySQL. Cette dernière permet de remplir une table MySQL à partir d’un fichier XML. Vous pouvez choisir les champs à inserer ou non.

Code source

Pré-requis

Avant toute chose, si vous voulez utiliser la fonction XMLtoSQL, il vous faut une fonction de connexion à une base de données. Ici la fonction getconnection() est utilisée. Elle se présente sous la forme :

<?php
function getConnection() {
        $mysql = "localhost"; // nom du serveur
        $login = "XXXXXX"; // identifiant de l'utilisateur
        $pwd = "XXXXXX"; // mot de passe de l'utilisateur
        $base = "nom_de_la_base"; // nom de la base
        $id_connect = mysql_connect($mysql, $login, $pwd)
        or die("Erreur interne : connexion au serveur de BD refus&eacute;e<br>");
        mysql_select_db($base)
        or die("Erreur interne : connexion &agrave; la BD refus&eacute;e<br>");
}
?>

Parseur XMLtoARRAY

<?php
// FONCTION qui transforme le fichier XML en tableau associatif PHP
// IN
// $fichier : STRING, chemin complet vers le fichier
// $item : STRING, nom de l'objet principal XML
// $champs : ARRAY, tableau des champs que l'on veux récupérer

// OUT
// Tableau associatif de la forme :
// [0]=>{ "champs1"=>"valeur1", "champs2"=>"valeur2" }
// [1]=>{ "champs1"=>"valeur3", "champs2"=>"valeur4" }

function XMLtoARRAY($fichier,$item,$champs) {
  // on lit le fichier
  if(file_exists($fichier)){
        if($chaine = @implode("",@file($fichier))) {
               
                // on éclate les objets <item>
                $tmp = preg_split("/<\/?".$item.">/",$chaine);
               
                // on parcours les <item>
                for($i=0;$i<sizeof($tmp)-1;$i+=1){
                        // on recherche les champs demandés
                        foreach($champs as $champ) {
                                $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
                                // on ajoute l'élément au tableau
                                $tmp3[$i][$champ] = @$tmp2[1];
                        }
                }
                // retourne le tableau associatif
                return $tmp3;
        }
  }else{
          return "Le fichier n'existe pas";
  }
}
?>

Parseur XMLtoSQL

<?php
// FONCTION qui remplit une table MySQL à partir d'un fichier XML
// IN
// $fichier : STRING, chemin complet vers le fichier
// $item : STRING, nom de l'objet principal XML, sert aussi de nom pour la table MySQL
// $champs : ARRAY, tableau des champs que l'on veux récupérer, equivalent des champs pour MySQL
// $test : INT, vaut 1 si vous en voulez pas executer les requêtes

// OUT
// Phrase de notification

function XMLtoSQL($fichier,$item,$champs,$test=0){

        //On recupère le tableau PHP correspondant au fichier XML
        $xml = XMLtoARRAY($fichier,$item,$champs);
        if(is_array($xml)){
                getconnection();
                $nom_table=$item;
                $requetes_insert=array();
                $requete="";
                foreach($xml as $un_enregistrement){
                        $requete="INSERT INTO ".$nom_table."  ";
                        $col_name="(";
                        $value="(";
                        foreach($un_enregistrement as $champs=>$valeur){
                                $col_name.=$champs.",";
                                $value.="\"".$valeur."\",";
                        }
                        $col_name=substr($col_name,0,-1);
                        $value=substr($value,0,-1);
                        $requete.=$col_name.") VALUES ".$value.")";
                        $requetes_insert[]=$requete;
                }
               
                //Si tout est ok on vide la table
                $vidange_table="TRUNCATE TABLE ".$nom_table;
                if($test==0){
                        $res_vidange=mysql_query($vidange_table);
                        if(!$res_vidange){
                                return "Erreur lors de la vidange de la table : ".$nom_table;
                        }
                }
                //Puis on execute les requêtes une par une
                foreach($requetes_insert as $key=>$une_requete){
                        if($test==0){
                                $res_requete=mysql_query($une_requete);
                                if(!$res_requete){
                                        return "Erreur lors de l'execution de la requete num ".$key." : ".$une_requete;
                                }
                        }
                }
                return "Importation des ".sizeof($requetes_insert)." requetes reussie";
        }else{
                return "L'erreur suivante a ete detectee : ".$xml;
        }
}
?>

Exemple d’utilisation

Notre fichier XML : test.xml

<?xml version="1.0" encoding="UTF-8"?>
<personne>
        <nom>MARTIN</nom>
        <prenom>Julien</prenom>
        <date_naissance>1996-10-06</date_naissance>
        <num_tel>764704140</num_tel>
</personne>

<personne>
        <nom>ROBERT</nom>
        <prenom>Marcial</prenom>
        <date_naissance>1996-10-06</date_naissance>
        <num_tel>764704140</num_tel>
</personne>

<personne>
        <nom>GRANDJEAN</nom>
        <prenom>Pierre</prenom>
        <date_naissance>1996-10-06</date_naissance>
        <num_tel>764704140</num_tel>
</personne>

Notre code PHP

<?php

echo XMLtoSQL("test.xml","personne",array("nom","prenom"));

?>

Résultats
- La table "personne" sera vidée
- Elle ne sera remplie qu’avec les champs nom et prenom du fichier XML. Les autres champs sont ignorés.
- La fonction affichera le nombre d’insertions dans la table

Code inspiré de la source : http://www.phpsources.org/scripts17...

Loïc Baumont

Commentaires Commentaires

Aucun commentaire

Ajouter un commentaire

Vous devez être identifié pour poster un commentaire. Merci de vous enregistrer ou de vous connecter sur la page d'identification


 

Articles dans Le coin des développeurs

Spip 2.1 : mes articles ont disparu !

Depuis le 3 Septembre 2010, les sites tournant sous la version 2.1 de Spip ont vu tous leurs (...)

Redémarrage automatique de Clamav après un plantage

Sur les RPS proposés par OVH, beaucoup de personnes ont des problèmes avec l’anti-virus Clamav qui (...)

Mise à jour d’un serveur releases OVH

Pourquoi mettre à jour votre serveur ? Les patchs : apportent des améliorations aux logiciels (...)

Mise à jour d’une table MySQL à partir d’un fichier CSV en PHP

Cette fonction permet de mettre à jour une table MySQL à partir d’un fichier CSV. Si la valeur (...)

QMail : corriger l’erreur "multilog : fatal : unable to lock directory"

Lorsque vous redémarrez QMail ou si vous ne recevez plus d’e-mails et que l’une des erreurs (...)


Membres

Espace Membre

57 square Herzog - ZAC Ban la Dame - Parc Eiffel Energie - 54390 FROUARD - 03 83 50 43 74 / Mentions légales

Thumbnails powered by Thumbshots