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

XML Discussion :

[libxml] I/O warning : failed to load external entity


Sujet :

XML

  1. #1
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut [libxml] I/O warning : failed to load external entity
    Bonjour à tous,

    Avec libxml 2.9.3, sur ubuntu 18.04, lorsque j'indique un fichier qui n'existe pas, j'obtiens l'erreur : I/O warning : failed to load external entity "/home/user/documents/404.xml" qui s'affiche dans stderr.

    Je souhaiterai gérer moi même la présentation des erreurs. Comment faire ?

    voici mon code :
    Code C : 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
    int
    dom_document_load(const gchar *uri)
    {
        xmlSAXHandler sh = {0, };
        //...
        sh.warning        = (warningSAXFunc) dom_parser_warning;// pas appelé
        sh.error          = (errorSAXFunc) dom_parser_error;// pas appelé
        sh.fatalError     = (fatalErrorSAXFunc) dom_parser_fatal_error;// pas appelé
     
        // Création du contexte
        xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(uri);
        if (ctxt == 0) {
            fprintf(stderr, "Erreur lors de la création du contexte\n");
            return -1;
        }
        // Fonctions de rappel à utiliser
        ctxt->sax2 = &sh;
     
        // Analyse
        xmlParseDocument(ctxt);
     
        if (ctxt->wellFormed) {
            fprintf("Document bien formé\n");
        } else {
            fprintf(stderr, "Document XML mal formé\n");
            xmlFreeParserCtxt(ctxt);
            return -1;
        }
     
        // Libération de la mémoire
        //...
     
        return 0;
    }
     
    main () {
      dom_document_load("/home/user/documents/404.xml");// output :
                                                        // I/O warning : failed to load external entity "/home/user/documents/404.xml"
                                                        // Erreur lors de la création du contexte
    }

    D'avance merci pour vos lumières.

  2. #2
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    Je poste ici une piste...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    gboolean
    dom_document_load(const gchar *uri, DomDocument **document, GError **error)
    {
        xmlParserCtxtPtr ctxt  = xmlNewParserCtxt();
        ctxt->sax->warning = dom_parser_warning;
        const char* fileID = "404.xml";
     
        xmlNewInputFromFile(ctxt, fileID);// le fichier 404.xml n'existe pas et la fonction dom_parser_warning est bien appelé.
     
        return FALSE;
    }
    to be continued...

    Edit:
    Je poste ici mon exemple au cas où ...
    Code C : 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
     
    gboolean
    dom_document_load(const gchar *uri, DomDocument **document, GError **error)
    {
        g_return_val_if_fail (error == NULL | *error == NULL, FALSE);
        g_return_val_if_fail(document!=NULL, FALSE);
     
        LIBXML_TEST_VERSION
     
        xmlSAXHandler sh = {0, };
        sh.internalSubset = (internalSubsetSAXFunc) dom_parser_internal_subset;
        sh.resolveEntity  = (resolveEntitySAXFunc) dom_parser_resolve_entity;
        sh.entityDecl     = (entityDeclSAXFunc) dom_parser_entity_decl;
        sh.attributeDecl  = (attributeDeclSAXFunc) dom_parser_attribute_decl;
        sh.startDocument  = (startDocumentSAXFunc) dom_parser_start_document;
        sh.endDocument    = (endDocumentSAXFunc) dom_parser_end_document;
        sh.startElement   = (startElementSAXFunc) dom_parser_start_element;
        sh.endElement     = (endElementSAXFunc) dom_parser_end_element;
        sh.processingInstruction = (processingInstructionSAXFunc) dom_parser_processing_instruction;
        sh.warning        = (warningSAXFunc) dom_parser_warning;
        sh.error          = (errorSAXFunc) dom_parser_error;
        sh.fatalError     = (fatalErrorSAXFunc) dom_parser_fatal_error;
     
        xmlParserCtxtPtr ctxt  = xmlNewParserCtxt();
        if (ctxt == NULL) {
            fprintf(stderr, "Failed to allocate parser context\n");
            return FALSE;
        }
        ctxt->sax = &sh;// utiliser sax2 ?
        xmlParserInputPtr *input = xmlNewInputFromFile(ctxt, uri);
        if (input==NULL) {
            g_print("No such file or directory\n");
            return FALSE;
        }
        ctxt->input = input;
     
        DomParserContext parser;
        //...
        parser.document = *document;
        ctxt->userData = &parser;// transmis en parametre des callback sax
     
        // Analyse
        xmlParseDocument(ctxt);
     
        if (ctxt->wellFormed==0) {
            fprintf(stderr, "Document XML mal formé\n");
            ctxt->sax = 0;
            xmlFreeParserCtxt(ctxt);
            return FALSE;
        }
     
        *document = ((DomParserContext*)ctxt->userData)->document;// it's my DOM
     
        // Libération de la mémoire
        ctxt->sax = 0;
        xmlFreeParserCtxt(ctxt);
     
        return TRUE;
    }
    J'ajoute ce petit lien, car il me faudra surement utiliser xmlSetExternalEntityLoader

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 31/07/2014, 23h09
  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