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 :

lecture d'un noeud XML contenant des nombres


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1
    Par défaut lecture d'un noeud XML contenant des nombres
    Bonjour,
    On essaye de récupérer une suite de nombres séparée par des espaces (3000 nombres) situés au niveau d'un noeud d'un fichier xml. On souhaite enregister chaque élément de cette suite dans un tableau a 3000 éléments. notre soucis est le suivant:
    On arrive à récuperer cette suite sous forme de chaîne de caracteres. cependant, nous on cherche a récuperer cette liste nombre par nombre.
    Pourriez vous nous aider?
    Merci par avance

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <libxml/parser.h>
    #include <libxml/xpath.h>
     
    int main() {
    //Ouverture d'un fichier txt pour sauvegarder les données xml recupérées
    char test[3000];
    double test2;
    // Ouverture du document XML
    xmlKeepBlanksDefault(0); // Ignore les noeuds texte composant la mise en forme
     xmlDocPtr doc = xmlParseFile("donnees.xml");
     
    if (doc == NULL) 
    {
    fprintf(stderr, "Document XML invalide\n");
    return EXIT_FAILURE;
    }
    / Initialisation de l'environnement XPath
    xmlXPathInit();
     // Création du contexte
    xmlXPathContextPtr ctxt = xmlXPathNewContext(doc);
    if (ctxt == NULL) 
    {
     fprintf(stderr, "Erreur lors de la création du contexte XPath\n");
    return EXIT_FAILURE;
     }
     // Evaluation de l'expression XPath
    xmlXPathObjectPtr xpathRes = xmlXPathEvalExpression("/region/regionsphere/elements/text()", ctxt);
    if (xpathRes == NULL) 
    {
    fprintf(stderr, "Erreur sur l'expression XPath\n");
    return EXIT_FAILURE;
    }
    // Manipulation du résultat
    xmlNodePtr tab;
    if (xpathRes->type == XPATH_NODESET) 
    {
    int i;
       for (i = 0; i < xpathRes->nodesetval->nodeNr; i++) {
       xmlNodePtr n = xpathRes->nodesetval->nodeTab[i];
     
     
    if (n->type == XML_TEXT_NODE || n->type == XML_CDATA_SECTION_NODE) 
    {
    tab=n->content;
     printf("%s\n", tab);	}
    sscanf (tab, "%600c" , test) ;
    printf("test =%s\n", test);
    sscanf (test, "%c" , test2) ;
    printf("test2=%f\n",test2);
    // test
    printf("\n test0 =%c\n", test[0]);
    printf("test1 =%c\n", test[1]);
    printf("test2 =%c\n", test[2]);
    printf("test3 =%c\n", test[3]);  
     
     xmlXPathFreeObject(xpathRes);
     xmlXPathFreeContext(ctxt);
     xmlFreeDoc(doc);
     return EXIT_SUCCESS;
     
    }

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    plusieurs choses..

    Je ne sais pas ce qu'est la définition de tab..

    Mais quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf (tab, "%600c" , test) ;
    déjà tu ne prends que 600 caractères alors que test est dimensionné à 3000.

    Ensuite, une copie de buffer de char s'effectue par strcpy.

    Enfin, une lecture peut se faire avec une boucle simple :

    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
    float f[3000] ;
    char *p ;
    int n=0;
    int l ;
     
    p = tab ; /* on se postionne au début */
    while ( p != NULL ) /* Tant qu'on n'est pas à la fin du buffer */
    {
      if ( (*p == '\n') || (*p == '\r') || (n == 3000) ) /* pour tenir compte de la fin */
         break ;
     
      while ( (*p == ' ') || (*p == '\t') ) /* pour ne pas démarrer sur un blanc (pour se servir de l ci-dessous) */ 
         p++ ;
     
      l = sscanf ( p, "%f", &(f[n]) ); /* On lit et on stocke */
      n = n + 1 ; /* On incrémente le nombre lu */
      p = p + l ; /* Avancer à la fin du mot (l est la longueur lue) */
    }

Discussions similaires

  1. Utilisation de variable contenant des nombres a virgule en SQL
    Par Rukawa dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 27/10/2006, 18h54
  2. [JDOM] Parser un xml contenant des caractères spéciaux
    Par Baptiste Wicht dans le forum Format d'échange (XML, JSON...)
    Réponses: 16
    Dernier message: 19/07/2006, 11h57
  3. Tri sur une chaîne de caractères contenant des nombres
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2006, 11h52
  4. [VBA-E]Plage contenant des nombres et du texte
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/04/2006, 18h33
  5. [XML] [EXPAT] traitement d'un flux de donnée xml contenant des \n
    Par firejocker dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 23/02/2006, 16h49

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