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 :

[libxml2] crash de la fonction xmlParseFile sur windows


Sujet :

XML

  1. #21
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par .:dev:.
    je pourrais utiliser aussi la profondeur. en plus de l'etat.
    [...]
    les declarer en globals ? c'est la meilleur solution ?
    1) Je ne vois pas trop l'intérêt d'utiliser la profondeur, d'autant plus si le format du fichier en entrée est connu. Si l'état de l'automate a un instant T est "dans une balise X située dans une balise Y située à la racine", alors on connaît la profondeur. Cela dépend de ta connaissance du fichier en entrée et de ce que tu veux en faire (ex. : si tu le stockes dans un arbre, c'est l'arbre qui te dira à quelle profondeur tu es).
    2) Tout dépend de ce que permettent les fonctionnalités de expat : si tes fonctions "événementielles" reçoivent un "contexte" en paramètre et que ce dernier peut être dans un format choisi par tes soins, alors l'état en cours pourra être stocké dans ce "contexte" (qui sera global).
    Sinon, tes fonctions "événementielles" accèderont directement à l'état comme variable globale.
    Dans tous les cas, il faudra une variable/structure globale.
    Dans un cas, la fonction reçoit un pointeur vers cette variable/structure. Dans l'autre, la fonction y accède directement.
    Ne connaissant pas expat, je ne peux t'en dire plus.

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 62
    Par défaut
    bonjour,
    voila j'ai fait le code pour parser un fichier xml du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <document>
    		<avis>
    			<auteur>...</auteur>
    			<titre>...</titre>
    			<texte>...</texte>
    		</avis>
    		<avis>
    			<auteur>...</auteur>
    			<titre>...</titre>
    			<texte>...</texte>
    		</avis>
    </document>
    je vais mettre juste les callbacks:

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
     
    int etat=0; // global
     
    enum ETAT{OUVERT=0,AVIS_O,AUTEUR_O,AUTEUR_B,TITRE_O,TITRE_B,TEXTE_O,TEXTE_B};
     
    // balise ouverte
    static void XMLCALL
    start(void *userData, const char *name, const char **atts)
    { 
      switch(etat)
      {
    	  	case OUVERT:
    					 if(strcmp(name,"document")==0)
    					 {
    					 															 etat=AVIS_O;
    					 }
    					 else{
    					 			printf("erreur");
    					 			exit(0);
    						}
    					 break;
    			case AVIS_O:
    					 if(strcmp(name,"avis")==0)
    					 {
    					 											 etat=AUTEUR_O;
     
    					 }
    					 break;
    			case AUTEUR_O:
    					 if(strcmp(name,"auteur")==0)
    					 {
    					 											 etat=AUTEUR_B;
     
    					 }
    					 break;	
    		 case TITRE_O:
    					 if(strcmp(name,"titre")==0)
    					 {
    					 											 etat=TITRE_B;
     
    					 }
    					 break;
    		 case TEXTE_O:
    					 if(strcmp(name,"texte")==0)
    					 {
    					 											 etat=TEXTE_B;
     
    					 }
    					 break;	
    	 }				 
    }
     
    // balise fermée
    static void XMLCALL
    end(void *data, const char *el)
    {
     				 if(strcmp(el,"avis")==0)
     				 {
    				 					etat=AVIS_O;							 
    				 }
    				 else if(strcmp(el,"auteur")==0)
     				 {
    				 					etat=TITRE_O;							 
    				 }
    				 else if(strcmp(el,"titre")==0)
     				 {
    				 					etat=TEXTE_O;							 
    				 }
    				 else if(strcmp(el,"texte")==0)
     				 {
    				 					etat=AVIS_O;							 
    				 }
    }
     
    // donne textuelle
    static void XMLCALL
    text(void *userData,const XML_Char *s,int len)
    {
     					char *p_texte;
            switch(etat)
     				{
    						 			  case AUTEUR_B:
    												 p_texte=malloc(len+1);
    				 								 strncpy(p_texte,s,len);
    				 								 p_texte[len+1]='\0';
    				 								 printf("Auteur = %s\n",p_texte);
    				 								 free(p_texte);
    				 								 break;
    	 								  case TITRE_B:
    												 p_texte=malloc(len+1);
    				 								 strncpy(p_texte,s,len);
    				 								 p_texte[len+1]='\0';
    				 								 printf("Titre = %s\n",p_texte);
    				 								 free(p_texte);
    				 								 break;
    			   						case TEXTE_B:
    												 p_texte=malloc(len+1);
    				 								 strncpy(p_texte,s,len);
    				 								 p_texte[len+1]='\0';
    				 								 printf("Texte = %\n",p_texte);
    				 								 free(p_texte);
    				 								 break;
    				  }
    }
    mon code affiche juste l'auteur, titre ...
    je voulais savoir si c'est la meilleur methode.
    je dois stocker les données dans une liste chainée, je vois pas comment faire parce que j'ai pas tous les données au meme moment je dois les stocker quelque part je vois pas : /
    voila merci pour votre aide

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 62
    Par défaut
    bonsoir
    pas de reponse
    Pour ma 2eme question ca n' a rien à voir avec xml.
    La fonction static void XMLCALL text renvoie chaque fois des données textuelles si elle les rencontre donc ce qui a entre les balises auteur apres titre ...
    j'ai une liste chainée fait avec glib donc pour ajouter je dois stocker les données dans ma structure apres l'ajouter. (dans mon exemple je fais que afficher les données).
    mon probleme c'est que je vois pas quand declarer ma structure et allouer la memoire la plus facile methode c'est de la declarer en global mais c'est pas du tt la meilleure.
    help

  4. #24
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par .:dev:.
    mon probleme c'est que je vois pas quand declarer ma structure et allouer la memoire la plus facile methode c'est de la declarer en global mais c'est pas du tt la meilleure.
    Utiliser les fonctions callback de début et de fin de document pour respectivement allouer et libérer cette mémoire, sachant que vous pouvez passer des données à ces fonctions de rappel (voir la fonction xmlSAXUserParseFile par exemple).


    Julp.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/10/2009, 11h25
  2. Fonction RSA_print_fp crash sur Windows
    Par bkadoum dans le forum C
    Réponses: 3
    Dernier message: 29/01/2009, 11h58
  3. Réponses: 1
    Dernier message: 06/06/2007, 18h20
  4. Probleme avec IFRAME et fonction sur window.parent
    Par FadeOut dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/10/2006, 09h31
  5. configurer la fonction mail sur apache (windows)
    Par sensoo dans le forum Apache
    Réponses: 4
    Dernier message: 12/04/2006, 14h26

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