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

 C Discussion :

Invalid conversion from 'const char*' to 'xmlChar'


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Invalid conversion from 'const char*' to 'xmlChar'
    Bonjour, j'essaie de parser un XML avec Libxml et Xpath, mais quand je teste mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlXPathEvalExpression("/racine/noeud", ctxt);
    J'obtiens une erreur :

    error: invalid conversion from 'const char*' to 'xmlChar'
    Qu'est-ce que ça veut dire, étant donné que je ne définis pas de char à cette ligne ?

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Le type de l'argument "/racine/noeud" est const char *

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    En quelque sorte c'est une chaîne de caractères oui... Mais comment écrire l'expression autrement ?

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlXPathEvalExpression(BAD_CAST "/racine/noeud", ctxt);

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Merci, BAD_CAST a l'air de fonctionner. Mais est-ce la meilleure solution ? Si j'ai bien compris, BAD_CAST demande d'ignorer les erreurs de typage, ne vaudrait-il pas mieux régler le problème de typage ?

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    BAD_CAST est simplement une macro de la libxml2 qui vaut (xmlChar *).

    Autrement dit ajouter BAD_CAST ne fait que caster ton (const char *) en (xmlChar *), ce qui est tout à fait propre.

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    OK, merci pour la précision. Mais j'ai un autre problème à présent, toujours avec Xpath. Dans le flux XML suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8" ?> 
    <hordes>
        <data cache-date="2010-11-12 15:55:02" cache-fast="0">
            <city door="1"></city>
        </data>
    </hordes>
    Je veux lire la valeur de l'attribut "door", pour cela j'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int xml_etatPorte;
     
    xmlXPathObjectPtr xpathRes = xmlXPathEvalExpression(BAD_CAST "/hordes/data/city[@door]", ctxt);
     
    xml_etatPorte = xmlXPathCastNodeSetToNumber(xpathRes->nodesetval);
    Au lieu de me renvoyer "1", il me renvoie "-2147483648". Où est mon erreur ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bon, j'ai un peu progressé grâce à la doc. J'arrive à lire le nom du noeud avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml_etatPorte = xpathRes->nodesetval->nodeTab[0]->name
    Mais moi je veux la valeur de l'attribut "door". J'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml_etatPorte = xpathRes->nodesetval->nodeTab[0]->properties[0]
    Mais il me revoie "null" au lieu de "1" ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    J'ai trouvé, il faut utiliser la fonction xmlGetProp().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	xmlChar *xml_etatPorte;
    	xmlXPathObjectPtr xpathRes = getnodeset(doc, BAD_CAST "/hordes/data/city");
    	xml_etatPorte = xmlGetProp(xpathRes->nodesetval->nodeTab[0], BAD_CAST "door");
    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
    xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath) // Créé un contexte Xpath et récupère un noeud donné
    {
    	xmlXPathContextPtr context = xmlXPathNewContext(doc);
    	if (context == NULL) {
    		fprintf(stderr, "Erreur lors de la création du contexte XPath.\n");
    		exit(-1);
    	}
    	xmlXPathObjectPtr xpathRes = xmlXPathEvalExpression(xpath, context);
    	xmlXPathFreeContext(context);
     
    	if (xpathRes == NULL) {
    		fprintf(stderr, "Erreur dans l'expression XPath.\n");
    		exit(-1);
    	}
    	return xpathRes;
    }
    En fait j'avais une incompréhension sur l'expression Xpath :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlXPathEvalExpression(BAD_CAST "/hordes/data/city[@door]", ctxt);
    Cela ne signifie pas " récupérer l'attribut "door" du noeud "city" "
    mais " récupérer le noeud nommé "city" et ayant un attribut "door" ".

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/09/2011, 16h53
  2. Réponses: 8
    Dernier message: 15/03/2011, 18h14
  3. Réponses: 4
    Dernier message: 15/10/2008, 22h30
  4. Réponses: 7
    Dernier message: 16/02/2008, 08h30
  5. error: invalid conversion from `const wxChar*' to `CHAR*'
    Par barbarello dans le forum wxWidgets
    Réponses: 16
    Dernier message: 31/01/2006, 12h28

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