Parser un fichier xml

boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 - 18 août 2009 à 21:46
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 - 24 nov. 2009 à 22:51
Bonsoir,

Je voulais parser mon fichier XML pouyr extraire certaines informations pour les utiliser dans mon programme C.

J'ai trouvé la librairie libxml2 qui est codée en C et qui possède deux méthodes DOM et SAX.

J'ai bien installé libxml2 et j'ai décidé de travailler avec la méthode SAX qui permet de parser des fichiers XML assez grand et n'est pas gourmande en mémoire.

J'ai trouvé des exemples en général et non simples pour un débutant sur le site officiel de libxml2. Ces exemples sont plus pour la méthode DOM. Je ne trouve pas un exemple pour SAX.

- Est ce que il y a quelqu'un qui a rencontré ce type de problème ?

- Pouvez vous me donner un exemple typique pour que j'applique sur mon fichier XML car j'ai besoin des informations qui se trouvent dans le dernier noeud de mon fichier XML ?

Merci.

208 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 sept. 2009 à 11:43
fprintf...

je re-re-re-re-répète : INUTILE de jouer à écrire un fichier pour le plaisir de le relire au cours de la même exécution !

les données sont en mémoire, facilement exploitables.

à quoi bon s'amuser à les écrire dans un fichier et les relire ensuite ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
15 sept. 2009 à 19:25
à quoi bon s'amuser à les écrire dans un fichier et les relire ensuite ?


J'ai besoin de ces fichiers dans un autre traitement. Je vais l'utiliser dans un autre projet à part pour créer une interface graphique.
Donc j'ai besoin des résultats sauvegardés en fichiers.

Dans la solution le type de la valeur 'extent',
Vous le considérez comme un entier ou une chaine de caractère ?

Le type de de la valeur 'extent' est une chaine de caractère ?

fprintf...


seulement on remplace printf par fprintf ?

Si on a le cas 1, 2 3 alors je voulais sauvegarder le résultat dans un fichier. Mais comment savoir après qui on a deux champs (extent et intent) dans chaque ligne ?

Merci.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 sept. 2009 à 21:08
dans un autre projet....

pourquoi ne pas y inclure l'extraction des données, directement ?

extent est un char*

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
15 sept. 2009 à 22:09
pourquoi ne pas y inclure l'extraction des données, directement ?


J'ai besoin de fichier résultat dans L'interface est en Vb.net
par exemple afficher le contenu de fichier resultat dans listebox en cliquant sur le bouton ...

Est ce possible de mettre le code C dans l'interface VB.net ?

Comment devenir la solution tout en sauvegardant le résultat dans le fichier suivant les cas comme décrite au dessus ?


Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 sept. 2009 à 22:37
:o pourquoi ne pas faire l'extraction en VB.Net ?

tu t'mbete a choisir SAX, parce que leger en mémoire, et derrièrer tu mets du .Net !

c'est une blague ?

.Net est très capable de faire cette analyse...

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
15 sept. 2009 à 23:56
c'est une blague ?


je parle sérieusement.
Vous avez m'aider dans ce problème.
Je n'ai pas encore utiliser le vb.net pour faire interface peut je vais choisi autre
comme GTK.

.Net est très capable de faire cette analyse...

analyse de quoi ?


Supposons que il est demandé de afficher le résultat dans le fichier test alors comment vous résoudre ce problème ?

Merci.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 sept. 2009 à 05:13
ce que j'ai du mal a comprendre, c'est que le XML se veut un format de fichier simple à analyser, à lire... quelque soit la technologie utilisée pour le faire.

du coup, j'ai du mal à saisir l'interet de placer les données dans un autre fichier, pour le plaisir.

la seule chose intelligente a faire, je pense, serai d'enregistrer _concepts dans un nouveau fichier XML, formatté comme il te plaira.
ainsi, il restera facile à lire en .Net ou autre ; contiendra toutes les infos requises, hierarchisées

une version allégée de input.xml en quelques sortes.

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
16 sept. 2009 à 06:03
Bonjour,

Comment devenir la dernière solution tout en sauvegardant le résultat dans un fichier suivant les cas décrits auparavant ?

Merci.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
18 sept. 2009 à 07:39
Bonjour,
Voici mon essai concernant l'affichage de résultat dans un fichier:

void DisplayConceptInfos(int index, int showExtent,FIEL *fp) {

REF* ref;



// On valide la valeur de l'index

if (index>=0 && index<_countCpt) {

if (showExtent) {

ref = _concepts[index].extent;
 
if (ref) {

while (ref) {

if (ref->reference)

fprintf(fp,"%s ", ref->reference);

ref = ref->next;

}

fprintf(fp,": ");

}

}



ref = _concepts[index].intent;

while (ref) {

if (ref->reference)

fprintf(fp,"%s ", ref->reference);

ref = ref->next;

}

fprintf(fp,"\n");	

}

}


j'appelle cette fonction dans 'main' comme suit :

int main()
{
FILE *fp;
fp = fopen("resultat.txt"."w");
..........
DisplayConceptInfos(i, 1,fp);
........
}


Que pensez vous ? Est que on peut améliorer la solution ?

Supposons que nous trouvons comme résultat:
valeur de 'extent' : valeur de 'intent'

par exmeple:
2 10 3 5 : b c d a

Comment on va modifier la fonction 'DisplayConceptInfos' ?
pour obtenir l'affichage suivant:
2 : b c d a
10 : b c d a
3 : b c d a
5 : b c d a

c'est à dire chaque objet de même 'extent' avec la valeur de 'intent' correspond.

Merci
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 sept. 2009 à 08:49
le code est bon

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
18 sept. 2009 à 19:18
Bonsoir,
l'affichage précédent nous donne par exemple:

2 10 3 5 : b c d a

Comment on va modifier la fonction 'DisplayConceptInfos' ?
pour obtenir l'affichage suivant:
2 : b c d a
10 : b c d a
3 : b c d a
5 : b c d a

c'est à dire chaque objet de même 'extent' avec la valeur de 'intent' correspond.

Merci
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
19 sept. 2009 à 12:27
Bonjour,

Dans le même programme, je vais parser plusieurs fichiers xml.

Est ce que pour chaque lecture et traitement d'un fichier xml alors je fait au appel à la fonction 'cleanup()' ou bien l'appel se fait une seule fois ?

par exemple:
.............
.............
int main()
{
.........
...........
int i;
char fichier[30];

for(i=1;i<=5;i++)
{
 
sprintf(fichier,"test%d.xml",i)

//lecture
lire_fichier("treillis1.lat.xml");

//traitement
................
................

//libeération 
cleanup();

}
....
....
return 0;
}


ou bien on fait appel la fonction 'cleanup()' en dehors de boucle ' for' ?


Que proposez vous ?

Merci.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 sept. 2009 à 13:31
lecture, nettoyage

deux etapes liées.

donc a laisser dans la boucle.

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
19 sept. 2009 à 18:58
Merci.


l'affichage précédent nous donne par exemple:

2 10 3 5 : b c d a

Comment on va modifier la fonction 'DisplayConceptInfos' ?
pour obtenir l'affichage suivant:
2 : b c d a
10 : b c d a
3 : b c d a
5 : b c d a

c'est à dire chaque objet de même 'extent' avec la valeur de 'intent' correspond.

Merci
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
21 sept. 2009 à 15:22
Bonjour,

Je vous remercie pour votre aide pour résoudre ce problème.

Il me reste un petit problème dans l'affichage de résultat et surtout dans la prise élément par élément de la valeur de 'extent'.

l'affichage précédent nous donne par exemple:

2 10 3 5 : b c d
8 9 4 6 : a b d

Comment on va modifier la fonction 'DisplayConceptInfos' ?
pour obtenir l'affichage suivant:
2 : b c d
10 : b c d
3 : b c d
5 : b c d
8 : a b d
9 : a b d
4 : a b d
6 : a b d

c'est à dire chaque objet de même 'extent' avec la valeur de 'intent' correspond.

Merci.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
24 sept. 2009 à 09:46
Bonjour,

S'il vous plaît, aidez moi.

Merci.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 sept. 2009 à 10:04
comme cela :
void DisplayConceptInfos(int index, int showExtent) {
REF* extent;
REF* intent;

// On valide la valeur de l'index
if (index>=0 && index<_countCpt) {
if (showExtent) {
extent = _concepts[index].extent;
if (extent) {
while (extent) {
if (extent->reference)
printf("%s : ", extent->reference);
intent = _concepts[index].intent;
while (intent) {
if (intent->reference)
printf("%s ", intent->reference);
intent = intent->next;
}
printf("\n");	
extent = extent->next;
}
}
}
else {
intent = _concepts[index].intent;
while (intent) {
if (intent->reference)
printf("%s ", intent->reference);
intent = intent->next;
}
printf("\n");	
}
}
}




Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
28 sept. 2009 à 10:24
Bonjour,

Merci beaucoup çà marche.

cette solution présente une partie de mon projet C.

En réalité dans mon projet C je m'intéresse au temps d'exécution.

Je manipule des fichiers et de structures dynamiques.

j'utilise le plus les fichiers textes pour stocker les résultats obtenus ou bien comme une structure intermédiaire pour faire autre traitement.

Ma question quel est le mieux au niveau le moins temps d'exécution est d'utiliser des structures dynmaiques(puis libérer ces structures à la fin de leur utilisation) ou bien passer par les fichiers ? et pourquoi ?
La différence au niveau temps d'exécution est presque le même ou bien c'est beaucoup différent ?

Merci.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 sept. 2009 à 10:39
pas de fichier, inutile de mettre des infos dans un fichier pour les relire dans la foulée.
les accès disque sont pénalisant, en plus

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
28 sept. 2009 à 11:21
J'ai crée un module qui permet de comparer deux fichiers textes selon des critères spécifiques.
le premier fichier contient toutes les combinaisons binaires d'un ensemble des attributs et le deuxième fichier contient la liste des concepts.
par exemple le premier fichier contient :
a b
a c
a d
a b c
a b d
a d e
a b c d
et le deuxième fichier contient:
a
b
c
d
a b
a c
a b c
a c d

Ce module de comparaison çà marche.
Mais je ne sais pas si on remplace les deux fichiers par autres structures de données alors on obtient moins temps d'exécution ?

De plus, est ce que il aura beaucoup des modifications à faire dans le code ?

Est ce que toujours l'utilisation des tableaux ou listes chainées est mieux toujours ? il n' y pas des limites ? par exemple débordement, mauvaise gestion d'adressage, espace illimitée,...

Est ce que une possibilité d'améliorer l'utilisation des fichiers ?

Enfin que proposez vous ?


Merci.
0
Rejoignez-nous