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

[Résolu/Fermé]
Signaler
Messages postés
11
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
7 avril 2010
-
Messages postés
11
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
7 avril 2010
-
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

Messages postés
18597
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
22 septembre 2021
4 320
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
18597
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
22 septembre 2021
4 320
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
11
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
7 avril 2010
2
MERCI !

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

Un grand merci à toi avion-f16
Messages postés
11
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
7 avril 2010
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.
Messages postés
18597
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
22 septembre 2021
4 320
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 ;)
Messages postés
11
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
7 avril 2010
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. :-(