Récupération de données dans un fichier XML.

Résolu
sigouil Messages postés 11 Statut Membre -  
sigouil Messages postés 11 Statut Membre -
Bonjour, après une journée complète à chercher sur net, il faut que je me rende à la conclusion : j'ai rien compris !
Je vous explique mon problème.
J'ai un fichier xml contenant des infos que je doit injecter dans une base Mysql. Le fichier se présente de la sorte :
<?xml version="1.0" encoding="windows-1252"?>
<CLIENTS>
<CLIENT>
<CODE_CLIENT>001</CODE_CLIENT>
<TYPE_OFFRE>2</TYPE_OFFRE>
<CODE_SOCIETE>0001</CODE_SOCIETE>
<CODE_SITE>02</CODE_SITE>
<NO_DOSSIER>00001</NO_DOSSIER>
</CLIENT>
<CLIENT>
<CODE_CLIENT>002</CODE_CLIENT>
<TYPE_OFFRE>2</TYPE_OFFRE>
<CODE_SOCIETE>0001</CODE_SOCIETE>
<CODE_SITE>02</CODE_SITE>
<NO_DOSSIER>00002</NO_DOSSIER>
</CLIENT>
...
</CLIENTS>

Le début de mon code PHP est standard :
<?php
        //Charger le fichier XML
        $fichier = "CLIENTS.XML";
        $dom = new DOMDocument(); 
        if (!$dom->load($fichier)) {
            die("Impossible de charger le fichier XML");
        }


ensuite il y a une boucle 'foreach'.
Après cela, je me suis embrouillé est je suis partis dans toutes les directions (sauf la bonne )
Pourriez-vous me donner la marche à suivre pour la boucle de lecture des differentes entrées du XML. La partie Mysql doit etre à ma porté.

Merci.

6 réponses

  1. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Commence déjà par mettre des balises en minuscules, ainsi que le nom de ton fichier. Et utilises plutôt utf-8 comme encodage.

    Pour ta boucle :
    $clients = document->getElementsByTagName('clients')->item(0);
    
    <CODE_CLIENT>002</CODE_CLIENT>
    <TYPE_OFFRE>2</TYPE_OFFRE>
    <CODE_SOCIETE>0001</CODE_SOCIETE>
    <CODE_SITE>02</CODE_SITE>
    <NO_DOSSIER>00002</NO_DOSSIER>
    
    foreach($clients->getElementsByTagName('client') as $client) {
        $code_client = $client->getElementsByTagName('code_client')->firstChild->nodeValue;
        $type_offre = $client->getElementsByTagName('type_offre')->firstChild->nodeValue;
        $code_societe = $client->getElementsByTagName('code_societe')->firstChild->nodeValue;
        $code_site = $client->getElementsByTagName('code_site')->firstChild->nodeValue;
        $no_dossier = $client->getElementsByTagName('no_dossier')->firstChild->nodeValue;
    
        // ta requête SQL
    }
    
    2
  2. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Après les getElementsByTagName, il faut ajouter "->item(0)".
    $code_client = $client->getElementsByTagName('CODE_CLIENT')->item(0)->nodeValue;
    Si ça ne fonctionne toujours pas :
    $code_client = $client->getElementsByTagName('CODE_CLIENT')->item(0)->firstChild->nodeValue;
    2
  3. sigouil Messages postés 11 Statut Membre 2
     
    MERCI !

    C'est bon, ca marche.
    J'ai rarement perdu autant de temps à trouver une solution.

    Un grand merci à toi avion-f16
    1
  4. sigouil Messages postés 11 Statut Membre 2
     
    Merci de ta réponse avion-f16, mais ça me renvoi un message d'erreur :

    Notice: Undefined property: DOMNodeList::$firstChild in C:\wamp\www\Projet\index.php  on line 27
    
    Notice: Trying to get property of non-object in C:\wamp\www\Projet\index.php on line 27
    

    La ligne 27 :
    $code_client = $client->getElementsByTagName('code_client')->firstChild->nodeValue;
    (j'ai commenté les autres lignes du foreach pour limiter les messages d'erreur)

    en retirant ->firstChild->nodeValue je n'ai pas ces message, mais '$client' est vide.

    Pour le fichier XML, je n'ai aucun pouvoir dessus. il se trouve sur un site externe.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Retire seulement "->firstChild", mais laissse "->nodeValue".
    Avec DOM en JS on est obligé de mettre firstChild pour récupérer la valeur du noeud, mais pas en PHP ...

    Retire aussi ce gros bloc :
    <CODE_CLIENT>002</CODE_CLIENT>
    <TYPE_OFFRE>2</TYPE_OFFRE>
    <CODE_SOCIETE>0001</CODE_SOCIETE>
    <CODE_SITE>02</CODE_SITE>
    <NO_DOSSIER>00002</NO_DOSSIER>
    C'était pour ne pas avoir à monter/descendre quand je codais le script ;)
    0
  7. sigouil Messages postés 11 Statut Membre 2
     
    J'avais déjà testé comme ca, mais cela ne change presque rien, si ce n'est que je n'ai qu'une erreur par itération.

    Erreur :
    Notice: Undefined property: DOMNodeList::$nodeValue in C:\wamp\www\Projet\index.php on line 26

    avec en ligne 26 :

    $code_client = $client->getElementsByTagName('CODE_CLIENT')->nodeValue;

    Je pense que je vais me tourner vers simpleXML. :-(
    0