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

Bibliothèques et frameworks PHP Discussion :

[XML] Ouvertures de XML dans foreach : failed to open stream et I/O warning : failed to load external entity


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut [XML] Ouvertures de XML dans foreach : failed to open stream et I/O warning : failed to load external entity
    Bonjour,

    Je souhaite faire des ouvertures multiples de fichiers XML dans une boucle et j'obtiens des warnings de type failed to open stream et I/O warning : failed to load external entity.

    Mon fichier .htaccess possède ces 2 lignes :
    SetEnv ALLOW_URL_FOPEN ON
    SetEnv ALLOW_URL_INCLUDE ON
    J'ai un premier fichier XML qui donne une liste d'objets, j'ai ensuite pour chaque objet un fichier XML qui permet d'avoir plus d'infos sur cet objet.
    J'ai besoin de ces infos complémentaires donc je fais une boucle foreach qui parcourt le premier fichier XML et qui à chaque tour de boucle ouvre un nouvel objet.

    Le premier fichier XML s'ouvre sans souci, c'est ensuite pour les autres que j'obtiens à chaque fois 2 warnings (soit au total plus de 80 warnings dans ma page...).
    Ce qui est très bizarre est que j'arrive quand même à accéder aux informations des fichiers "enfants".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $annonces = simplexml_load_file('http://www.xxx.fr/services/objet');
     
               foreach ($annonces as $annonce):
                  //$title=$annonce->title;
     
                  //test d'affichage pour le fichier listing ==> OK
                  echo "<br />".$annonce->nid;
                  /*ouverture de la fiche objet pour récupérer d'autres informations */
                  $url_xml = 'http://www.xxx.fr/services/objet/'.$annonce->nid;
                  $annoncetraitee = simplexml_load_file($url_xml);
                  echo "<br />TEST".$annoncetraitee->path;
    Je ne comprends pas tous ces warnings ? Pourquoi sont-ils présents alors que le parseur semble récupérer les infos ?
    J'ai tenté de "vider" la variable $annoncetraitee en lui affectat un "null" mais ça ne change rien.

    Merci d'avance pour vos lumières...

    cli16

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Je n'avais pas vu qu'il y avait un forum spécifique à simpleXML... quelqu'un pourrait-il supprimer ce post ?

    Merci ;-)

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 131
    Points : 242
    Points
    242
    Par défaut
    Salut
    peux tu essayer ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $url_xml = 'http://www.xxx.fr/services/objet/'.$annonce->nid;
    $xml = file_get_contents($url_xml);
    $annoncetraitee = simplexml_load_string($xml);

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Merci pour ton retour, j'avais essayé avec file_get_contents, même problème, voici l'erreur :

    Warning: file_get_contents(http://www.xxx.fr/services/objet/299) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 406 Not Acceptable: Unknown or unsupported response format. in ... on line 266

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Je n'ai pas la gestion des fichiers XML.... est-il possible qu'ils soient "ouvrables" via navigateur mais qu'on ne puisse pas les parser à cause d'un accès limité ?

  6. #6
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Si on essaie à observer plus rigoureusement du type de variable, on peut faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //$url_xml = 'http://www.xxx.fr/services/objet/'.$annonce->nid;
    $url_xml = 'http://www.xxx.fr/services/objet/'.trim((string)$annonce->nid);
    J'ai mis une trim() en plus pour être un peu plus sûr puisque la valeur d'un noeud de texte a parfois des espaces vides dépouvues de sens qui ne sont pas souhaîtable d'y en avoir, dans un url, en tout cas.

    Essayez-le pour voir ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    J'ai essayé le trim mais ça ne change rien, j'ai même essayé de passer directement un des numéros "nid" en dur dans l'URL, le XML génère toujours des erreurs.

    Ce matin le fichier listing ne s'ouvrait pas non plus il me générait les mêmes erreurs. Une fois que je l'ai ouvert dans mon navigateur, j'ai relancé le parseur qui a fonctionné pour le fichier listing.

    On dirait que tant que le XML n'a pas été ouvert via navigateur on ne peut pas y accéder via un parseur.

    Est-il possible que les fichiers XML soient protégés ou limités en accès via du chmod ou htaccess ?

    Merci d'avance.

    cli16

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    En fait, les flux ne sont pas des fichiers physiques, mais des flux générés à la volée.

    Est-ce que la fonction simplexml_load_file est en mesure de parser des flux XML générés à la volée ? Ou bien est-ce qu'il faut que je passe par une classe PHP spécifique ?

    Merci pour votre retour.

    cli16

  9. #9
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    On dirait que tant que le XML n'a pas été ouvert via navigateur on ne peut pas y accéder via un parseur.
    Je dirais non, peu croyable, vois pas la raison.

    Je souhaite faire des ouvertures multiples de fichiers XML dans une boucle et j'obtiens des warnings de type failed to open stream et I/O warning : failed to load external entity.
    Ce genre de warnings provient plus probablement que le url ne s'ecriit pas correctement... Il est possible parfois la résolution ne se fait pas la même façon via un navigateur par rapport au script php. Tant qu'on est sure ce point, il n'est pas très clair pourquoi navigateurs soient mentionnés... Le script php n'est-il pas exécuté au serveur ? ou bien il est exécuté par quelque agent côté cliente ?

    En tout cas, verifiez plus soigneusement les urls, minutieusement. A la limite, replaçez le nom de domaine par son adresse ip pour s'assurer rien ne se passer abnormalement dans la résolution, dns.

    En plus, vous pouvez toujours mettre la main sur les streams avec curl, un façon ou un autre comme par exemple (pour debugger seulement, simplexml_load_file ou simplexml_load_string devrait largement suffisant mais on peut toujours le faire autrement) ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $url_xml = 'http://www.xxx.fr/services/objet/'.trim((string)$annonce->nid); 
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL, $url_xml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    $info = curl_getinfo($ch);
    var_dump($output);
    var_dump($info);

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Merci Tsuji.

    Avec curl j'arrive à voir le flux.

    Mais avec simplexml_load_file ou simplexml_load_string impossible d'obtenir quoi que ce soit.

    Est-il possible de parser via curl ? Ou bien est-ce que juste un moyen de vérifier l'affichage du flux ?

    Si j'arrive à voir le flux avec curl mais que je ne peux pas l'ouvrir avec aucun parseur XML (j'ai également testé du dom), que cela signifie-t-il ? Souci de serveur, souci de code php ?

    Désolée pour les questions de newbie....

    Merci d'avance.

  11. #11
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Il faut montrer un échantillon typique ce qu'on obtient avec curl pour faire une idée plus précise à déterminer quelle sort de pré-processus il faut y mettre sur le corps de flux... sinon, on ne sait quoi faire.

  12. #12
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je viens de découvrir que cli16 m'envoie il y a quatre jours un message privé pour m'informer un linkage réel que je ne dévulge pas ici sans sa pérmission bien entendu. Et je suis désolé pour ne pas pouvoir répondre plus tôt à cause de ça.

    Je suis donc capable de regarder de plus près de quoi il s'agit. Je décourvre en conséquence que la réponse du site sur $url_xml construit n'est pas du tout un document xml. Il s'agit plutôt un texte du type yaml. Naturellement, chargeant avec simplexml serait en échec.

    Je peut montrer comment faire avec un parseur yaml. Si vous avez PECL yaml installé, c'est plus commode de faire avec une méthode comme yaml_parse(), j'utilise un outil, cert mois efficace, d'implémentation php spyc. On peut donc faire le travail comme ça.
    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
    <?php
    require_once "spyc.php";
     
    //etc etc...
     
    $url='http://www.xxx.fr/services/objet';
    $annonces = simplexml_load_file($url);
     
    foreach ($annonces as $annonce) {
        //$title=$annonce->title;
     
        //etc etc
        $url_nid=$url.'/'.$annonce->nid;   //je change le nom à _nid, puisque xml ne devrait pas
     
        $ch=curl_init();
        curl_setopt($ch, CURLOPT_URL, $url_nid);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     
        $output = curl_exec($ch);
        $info = curl_getinfo($ch);
     
        if ($info['content_type']=='application/xml') {    //en fait, ne serait jamais, c'est pour la continuité
            $annoncetraitee=simplexml_load_string($output);
            echo "<br />TEST ".$annoncetraitee->path; 
        } elseif ($info['content_type']=='text/yaml') {
            //spyc solution
            $annoncetraitee = spyc_load_file($output);
            //si vous utilisez PECL yaml, il se peut grosso modo comme
            //$annoncetraitee=yaml_parse($output);
            echo "<br />TEST ".$annoncetraitee['path']; 
        }
     
        //etc etc
     
    }
     
    //etc etc
     
    ?>
    Voilà ce que j'arrive pour figurer ce quoi il s'agit dans ce cas; je le trouve intéressant aussi. Merci à cli16 pour le soulever comme question.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Merci pour le retour tsuji !

    J'ai appris hier que les flux était mal "calibrés" ! On m'avait indiqué que les flux étaient déjà utilisés ailleurs via des classes PHP parseur classiques (donc je pensais que le problème venait de mon côté...), mais il n'en était rien. Les flux étaient inutilisables avec du simpleXML ou du Dom. Je n'avais pas la main sur les flux donc j'étais très limitée en test.
    Désormais il possède une extension ".xml" qu'ils n'avaient pas avant.

    J'ai passé de longues heures à tenter de débugger & trouver une solution et j'ai emm**** des gentils internautes de ce forum !

    Donc si vous avez le même problème... prenez-vous en à ceux qui gèrent les flux !

    Beaucoup de temps perdu, c'est toujours très rageant...

    Merci quand même pour votre aide !

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

Discussions similaires

  1. Error: failed to load external entity
    Par jack-no dans le forum R
    Réponses: 0
    Dernier message: 08/10/2014, 11h32
  2. Réponses: 1
    Dernier message: 23/07/2014, 09h17
  3. [SimpleXML] Failed to load external entity
    Par naviguimmo dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 12/09/2013, 13h59
  4. Réponses: 3
    Dernier message: 10/04/2012, 15h07
  5. [SimpleXML] Erreur "failed to load external entity"
    Par seb92500 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 04/02/2007, 09h27

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