IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Insert fichier xml dans BDD avec des sous noeuds [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Par défaut Insert fichier xml dans BDD avec des sous noeuds
    Bonjour,

    Je recherche de l'aide concernant une insertion en php d'un fichier xml avec des sous noeuds identique.
    Le fichier xml est envoyé automatiquement tous les jours sur un ftp.

    Code fichier immo.xml :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?xml version="1.0" encoding="iso-8859-15" standalone="yes"?> 
    <biens> 
    <bien id="0"> 
    <reference>1234</reference> 
    <code_agence>1</code_agence> 
    <num_mandat>m1</num_mandat> 
    <nom_agence>xxx</nom_agence> 
    <code_postal>00000</code_postal> 
    <ville>XXXX</ville> 
    <type_bien>maison</type_bien> 
    <prix>72000</prix> 
    <images> 
    <image>http://xxx.com/image/1234_1_1_M.jpg</image> 
    <image>http://xxx.com/image/1234_1_2_M.jpg</image> 
    <image>http://xxx.com/image/1234_1_3_M.jpg</image> 
    <image>http://xxx.com/image/1234_1_4_M.jpg</image> 
    <image>http://xxx.com/image/1234_1_5_M.jpg</image> 
    </images> 
    </bien> 
    <bien id="1"> 
    <reference>5678</reference> 
    <code_agence>1</code_agence> 
    <num_mandat>m2</num_mandat> 
    <nom_agence>xxx</nom_agence> 
    <code_postal>00000</code_postal> 
    <ville>XXXX</ville> 
    <type_bien>appartement</type_bien> 
    <prix>52000</prix> 
    <images> 
    <image>http://xxx.com/image/5678_1_1_M.jpg</image> 
    <image>http://xxx.com/image/5678_1_2_M.jpg</image> 
    <image>http://xxx.com/image/5678_1_3_M.jpg</image> 
    </images> 
    </bien> 
    </biens>

    J'arrive à insérer tous les champs dans ma base de données sauf les images. C'est que la 1ère image qui est insérée. Mon problème se situe donc sur l'insertion des images.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    Code insert.php : 
     
    <?php 
    function apo($s1) 
    { 
    $s1 = trim($s1); // suppr les espaces 
    $s1 = trim($s1, "\xA0" ); // suppr les nbsp 
    $s1 = stripslashes($s1); // suppr les slashs avant les apostrophes 
    $s1 = str_replace("'", "''", $s1); // remplace les guillemets 
     
    // supprime les caractères non imprimables 
    $s2 = ""; 
    for ($i = 0; $i < strlen($s1); $i++) { 
    $c = substr($s1, $i, 1); 
    if (ord($c) >= 32) 
    $s2 .= $c; 
    } 
    return($s2); 
    } 
     
    // Récupération du fichier 
    $recup = simplexml_load_file("http://www.xxx.com/dossier/immo.xml"); 
     
    // On lance la fonction 
    frecur($recup); 
     
    /** 
    Fonction frecur 
    */ 
    function frecur($racine, $niveau = 0) { 
    // Pour chaque item 
    foreach($racine as $nom=>$texte) { 
    // Pour le noeud enfant 
    if(trim($texte) == "") { 
    for($i=1;$i<=$niveau;$i++) { echo " "; } 
    // on affiche le nom 
    echo "La balise <strong>".$nom."</strong>"; 
    // on récupere les enfants 
    $enfants = $texte->children(); 
    // on récupere les attributs s'ils sont présents 
    $str = ""; 
    $attributs = $texte->attributes(); 
     
    if(trim($attributs) != "") { 
    $str = "("; 
    foreach($attributs as $index=>$contenu) { 
    $str .= "[<strong>".$index."</strong>] <em>".$contenu."</em>, "; 
    } 
    $str = substr($str, 0, -2).")"; // Pour la mise en forme 
    } 
    echo $str." 
    "; 
     
    // comme on a un enfant, on réappelle la fonction (le niveau sert juste à la mise en forme) 
    frecur($enfants, $niveau + 0); 
     
    $bien=$texte; 
    } else { 
    // si on n'a pas d'enfant, on affiche ce qu'il y a dedans 
    for($i=1;$i<=$niveau;$i++) { echo " ";} 
    echo "La balise <strong>".$nom."</strong> contient <em>".$texte."<br />\n</em> 
    "; 
    } 
    mysql_query("INSERT INTO table SET BienReference='".apo($bien->reference)."' ,BienAgence='".apo($bien->code_agence)."' ,BienMandat='".apo($bien->num_mandat)."' ,AgenceNom='".apo($bien->nom_agence)."' ,BienCodePostal='".apo($bien->code_postal)."' ,BienVille='".apo($bien->ville)."' ,BienType='".apo($bien->type_bien)."' ,BienPrix='".apo($bien->prix)."' ,BienImages1='".apo($elem->images->image)."' ,BienImages2='".apo($elem->images->image)."' ,BienImages3='".apo($enfants->images->image)."' ,BienImages4='".apo($enfants->images->image)."' ,BienImages5='".apo($enfants->images->image)."'") or die("Erreur MySQL : ".mysql_error()); 
    } 
    } 
    ?>

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    J'ai pas spécialement envie de tout lire mais si je peux te donner un conseil: utilise les itérateurs de la SPL pour fabriquer un arbre qui représente ton XML (RecursiveArrayIterator), ensuite, utilise un wrapper objet relationnel capable d'enregistrer chaque noeud (que tu parcours avec un RecursiveTreeIterator sur ton ReccursiveArrayIterator) en utilisant notament getDepth et tu peux faire ça en un minimum de lignes de code en conservant une grande rapidité d'execution et une grande flexibilité.

    Bon courage.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Par défaut
    Merci pour ta réponse, je regarderai tout ça dans la soirée !

    Citation Envoyé par Benjamin Delespierre Voir le message
    Hello

    J'ai pas spécialement envie de tout lire mais si je peux te donner un conseil: utilise les itérateurs de la SPL pour fabriquer un arbre qui représente ton XML (RecursiveArrayIterator), ensuite, utilise un wrapper objet relationnel capable d'enregistrer chaque noeud (que tu parcours avec un RecursiveTreeIterator sur ton ReccursiveArrayIterator) en utilisant notament getDepth et tu peux faire ça en un minimum de lignes de code en conservant une grande rapidité d'execution et une grande flexibilité.

    Bon courage.

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Pour t'aider, voici à quoi pourrait ressembler ton algo:

    On va partir de cette structure XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    $buffer = <<< XML
    <?xml version="1.0" encoding="iso-8859-15" standalone="yes"?>
    <biens>
    	<bien id="0">
    		<reference>1234</reference>
    		<code_agence>1</code_agence>
    		<num_mandat>m1</num_mandat>
    		<nom_agence>xxx</nom_agence>
    		<code_postal>00000</code_postal>
    		<ville>XXXX</ville>
    		<type_bien>maison</type_bien>
    		<prix>72000</prix>
    		<images>
    		<image>http://xxx.com/image/1234_1_1_M.jpg</image>
    		<image>http://xxx.com/image/1234_1_2_M.jpg</image>
    		<image>http://xxx.com/image/1234_1_3_M.jpg</image>
    		<image>http://xxx.com/image/1234_1_4_M.jpg</image>
    		<image>http://xxx.com/image/1234_1_5_M.jpg</image>
    		</images>
    	</bien>
    	<bien id="1">
    		<reference>5678</reference>
    		<code_agence>1</code_agence>
    		<num_mandat>m2</num_mandat>
    		<nom_agence>xxx</nom_agence>
    		<code_postal>00000</code_postal>
    		<ville>XXXX</ville>
    		<type_bien>appartement</type_bien>
    		<prix>52000</prix>
    		<images>
    		<image>http://xxx.com/image/5678_1_1_M.jpg</image>
    		<image>http://xxx.com/image/5678_1_2_M.jpg</image>
    		<image>http://xxx.com/image/5678_1_3_M.jpg</image>
    		</images>
    	</bien>
    </biens>
    XML;
    que je mets dans un buffer pour l'exercice, mais on peut tout à fait ouvrir un flux réseau ou un fichier avec SimpleXMLIterator (regarde la doc).
    On va ensuite créer notre arbre XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $it = new SimpleXMLIterator(str_replace(array("\t", "\r\n"), "",$buffer));
    $itit = new RecursiveTreeIterator($it);
    Notre SimpleXMLIterator nous permet d'obtenir une structure Objet de ton XML (dommage que DOMXMLIterator n'existe pas...), on mets dessus un RecursiveTreeIterator qui va nous permettre d'itérer en profondeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    echo "<pre>";
    foreach ($itit as $nodename => $node)
    {
    	echo "$node ($nodename)\n";
    }
    echo "</pre>";
    Va afficher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    |- (bien)
    | |-1234 (reference)
    | |-1 (code_agence)
    | |-m1 (num_mandat)
    | |-xxx (nom_agence)
    | |-00000 (code_postal)
    | |-XXXX (ville)
    | |-maison (type_bien)
    | |-72000 (prix)
    | \- (images)
    |   |-http://xxx.com/image/1234_1_1_M.jpg (image)
    |   |-http://xxx.com/image/1234_1_2_M.jpg (image)
    |   |-http://xxx.com/image/1234_1_3_M.jpg (image)
    |   |-http://xxx.com/image/1234_1_4_M.jpg (image)
    |   \-http://xxx.com/image/1234_1_5_M.jpg (image)
    \- (bien)
      |-5678 (reference)
      |-1 (code_agence)
      |-m2 (num_mandat)
      |-xxx (nom_agence)
      |-00000 (code_postal)
      |-XXXX (ville)
      |-appartement (type_bien)
      |-52000 (prix)
      \- (images)
        |-http://xxx.com/image/5678_1_1_M.jpg (image)
        |-http://xxx.com/image/5678_1_2_M.jpg (image)
        \-http://xxx.com/image/5678_1_3_M.jpg (image)
    A toi d'adapter à partir de là, tu vois qu'avec des itérateurs, parcourir une structure XML est un jeu d'enfant.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    y'a pas besoin de récursivité la dedans, faut juste recuprer les images et les mettre a plat, d'ailleurs le code est bien trop compliquer pour pas grand chose, on peux faire plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    ini_set('mysql.trace_mode', true);
     
    $xml = simplexml_load_file('http://www.xxx.com/dossier/immo.xml');
     
    $table = array(
        'reference'   => 'BienReference',
        'code_agence' => 'BienAgence',
        'num_mandat'  => 'BienMandat',
        'nom_agence'  => 'AgenceNom',
        'code_postal' => 'BienCodePostal',
        'ville'       => 'BienVille',
        'type_bien'   => 'BienType',
        'prix'        => 'BienPrix',
        'image1'      => 'BienImages1',
        'image2'      => 'BienImages2',
        'image3'      => 'BienImages3',
        'image4'      => 'BienImages4',
        'image5'      => 'BienImages5',
    );
     
    foreach($xml->bien as $bien)
    {
        $data = array();
     
        foreach($bien as $key => $value)
        {
            if(array_key_exists($key, $table))
            {
                $data[$table[$key]] = sprintf("'%s'", mysql_real_escape_string($value->__toString()));
            }
        }    
     
        $images = (array) $bien->images;
     
        foreach($images['image'] as $key => $value)
        {
            $key = 'image' . (++$key);
     
            if(array_key_exists($key, $table))
            {
                $data[$table[$key]] = sprintf("'%s'", mysql_real_escape_string($value));
            }
        }
     
        print_r($data);
     
        $fields = implode(', ', array_keys($data));
        $values = implode(', ', $data);
     
        $sql = sprintf("INSERT INTO table (%s) VALUES(%s)", $fields, $values);
        echo $sql;
        //mysql_query($sql);
    }
    et avec PDO ca serait encore plus facil

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Par défaut
    Bonjour stealth35 et Benjamin,

    Merci pour ces différentes réponses ! J'ai analysé et testé vos méthodes, et j'ai gardé celle de stealth35 qui m'a paru plus simple à intégrer dans mon système.

    Je suis encore en train de tester car j'avais vraiment simplifier le fichier xml pour le test et je vous tiendrai au courant !

    Encore Merci à vous 2 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JDOM] Modifier un fichier XML dans java avec JDOM
    Par FatmaFafa dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 24/07/2012, 15h44
  2. Réponses: 0
    Dernier message: 04/01/2011, 19h45
  3. Créer fichier XML dans Servlet avec JDOM
    Par mzahir dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/07/2010, 12h41
  4. ouvrir fichier .txt dans excel avec des champs texte
    Par rom05 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/05/2008, 18h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo