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

Résolu/Fermé
sigouil Messages postés 11 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 7 avril 2010 - 6 avril 2010 à 18:48
sigouil Messages postés 11 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 7 avril 2010 - 7 avril 2010 à 17:23
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.
A voir également:

6 réponses

avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
6 avril 2010 à 21:32
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
avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
7 avril 2010 à 17:14
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
sigouil Messages postés 11 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 7 avril 2010 2
7 avril 2010 à 17:23
MERCI !

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

Un grand merci à toi avion-f16
1
sigouil Messages postés 11 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 7 avril 2010 2
7 avril 2010 à 12:50
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
7 avril 2010 à 14:11
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
sigouil Messages postés 11 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 7 avril 2010 2
7 avril 2010 à 16:52
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