Compilation parser XML pour intégration à un code C - C - Programmation
Marsh Posté le 18-02-2012 à 18:28:24
Voila, je pense que mon pb vient du fait qu'il est nécessaire d'écrire le chemin des librairies pendant la compilation. Je reformule donc mes questions:
-Existe-t-il des bibliothèques permettant de lire un fichier XML sans indiquer le chemin de ces bibliotheques lors de la compilation, en C ?
-Si non, avez-vous des solutions me permettant de récupérer des informations d'un fichier XML pour les post-traiter dans un programme C ? (je sais qu'avec java, il est possible d'extraire des données XML avec XPath)
Marsh Posté le 18-02-2012 à 18:43:54
Si tu ne veux pas de librairies, rien ne t’empêche de prendre le code source de expat et le linker directement avec ton code, je l'ai déjà fait il y a quelques années, c'est pas bien difficile.
Plus proche de ce que fait java, tu as la version C++ de Xerces que tu peux employer et qui a sauf erreur de ma part une API C.
A+,
Marsh Posté le 18-02-2012 à 18:47:48
C'est une solution intéressante. Je dois en déduire qu'il faut forcemment des librairies pour lire un fichier XML ?
Sinon, j'ai bien compris ton idée, mais je suis un petit débutant dans tout ça. Le code source de expat se trouve ou ? Car dans le dossier "lib" de expat, il y a 33 fichiers .... ^^
Marsh Posté le 18-02-2012 à 18:56:07
Lesquels constituent le source de expat.
Tu dois compiler expat comme une librairie, puis tu linke cette librairie à ton code.
Citation : Je dois en déduire qu'il faut forcemment des librairies pour lire un fichier XML ? |
Ce qui n'a rien d'étonnant. Tu en as aussi besoin avec java, tu ne fais pas autre chose en mettant une déclaration import.
La seule différence, c'est que la librairie est avec l'interpréteur java, alors que la elle sera directement dans ton code.
Citation : Existe-t-il des bibliothèques permettant de lire un fichier XML sans indiquer le chemin de ces bibliotheques lors de la compilation, en C ? |
On doit toujours donner les paths des fichier .h et des librairie au compilateur afin qu'il sache ou les retrouver. Sous linux c'est configuré dans le makefile en général, ou bien dans des variables d'environnement.
A+,
Marsh Posté le 18-02-2012 à 19:01:07
Merci pour tous ces renseignements.
Pardonne ma méconnaissance mais, pourrais tu me préciser comment faire cette manipulation "Tu dois compiler expat comme une librairie, puis tu linke cette librairie à ton code. "
Marsh Posté le 18-02-2012 à 19:39:41
froz a écrit : Merci pour tous ces renseignements. |
-dl les sources d'expat
-Executer le script ./configure
-make
-De base expat ne se compile pas en bibliothèque (Dans mon souvenir)
-Un solution un peu cracra est de compiler en lui passant les .o générés par expat
Exemple : gcc -Wall -ansi test.c ./expat-2.0.1/lib/*.o -o Test.exe
Marsh Posté le 18-02-2012 à 19:47:08
Si je fais ça, je vais créer un fichier test.exe avec le code de test.c et les librairies de expat. Or le but est d'avoir un code C (par exemple test.C) qui peut lire un XML sans avoir besoin du chemin de expat lorsque je l'execute.
Marsh Posté le 18-02-2012 à 19:57:07
froz a écrit : Si je fais ça, je vais créer un fichier test.exe avec le code de test.c et les librairies de expat. Or le but est d'avoir un code C (par exemple test.C) qui peut lire un XML sans avoir besoin du chemin de expat lorsque je l'execute. |
Non
Tu devrais (re)lire des cours de compilation...
Marsh Posté le 18-02-2012 à 20:01:45
désolé.
Qu'est ce qui doit se trouverdans mon fichier test.c ??
Marsh Posté le 18-02-2012 à 20:29:29
froz a écrit : Si je fais ça, je vais créer un fichier test.exe avec le code de test.c et les librairies de expat. Or le but est d'avoir un code C (par exemple test.C) qui peut lire un XML sans avoir besoin du chemin de expat lorsque je l'execute. |
Mais il en aura pas besoin: linker avec une librairie (en statique), c'est incorporer directement dans l’exécutable le code de la librairie.
A+,
Marsh Posté le 18-02-2012 à 20:41:16
Gilou, pourrais-tu s'il te plaît me préciser de façon détaillée la méthode à suivre ? Je suis un peu perdu
Marsh Posté le 19-02-2012 à 01:42:51
Voila, j'ai fait quelques modifications. Pour pouvoir compiler le programme sans donner les liens vers la bibliotheque, j'ai transformé les #include <libxml/FICHIER.h> en #include "FICHIER.h" et j'ai positionné les fichiers dans le meme répertoire que mon programme principale en C. Quand je compile, je n'obtiens plus d'erreur de librairie mais ce genre de chose.
Qu'en pensez-vous ?
Est-ce possible de compiler de cette façon ?
Pourquoi ai-je ces erreurs ?
froz@ubuntu:~/test$ gcc -o test test.c
/tmp/cc1cHvGJ.o: In function `main':
test.c.text+0x11): undefined reference to `xmlParseFile'
test.c.text+0x57): undefined reference to `xmlDocGetRootElement'
test.c.text+0x96): undefined reference to `xmlFreeDoc'
test.c.text+0xc1): undefined reference to `xmlFreeDoc'
collect2: ld a retourné 1 code d'état d'exécution
Marsh Posté le 19-02-2012 à 01:47:05
Non mais tu as déjà écrit un programme C ou pas? c'est le b.a. ba, ça
Il y a aucune technique spéciale à employer, si tu linkes en statique avec la librairie, elle sera mise dans l’exécutable, et les appels aux fonctions de la librairies dans ton code principal marcheront (c'est le boulot du linker de faire ça).
http://fr.wikipedia.org/wiki/%C3%89dition_de_liens
A+,
Marsh Posté le 19-02-2012 à 01:55:31
J'ai bien compris, mais je dois laisser mon fichier sour la forme XXX.C et pas le transformer en executable pour l'utiliser. Sinon, ça serait trop simple
Marsh Posté le 19-02-2012 à 01:57:00
Citation : Voila, j'ai fait quelques modifications. Pour pouvoir compiler le programme sans donner les liens vers la bibliotheque, j'ai transformé les #include <libxml/FICHIER.h> en #include "FICHIER.h" et j'ai positionné les fichiers dans le meme répertoire que mon programme principale en C. Quand je compile, je n'obtiens plus d'erreur de librairie mais ce genre de chose. |
En fait si, c'est une erreur de librairie: à l'édition de lien, le linker ne trouve pas le code des fonctions de la librairie que tu utilises, et c'est ce qu'il indique comme erreur. Il faut lui passer un argument avec -l: -ltoto lui dit de chercher dans une librairie nommée libtoto.lib (ou libtoto, je sais plus comment c'est sous linux)
>> gcc -o test test.c
Faudra au minimum faire gcc -o test test.c -lexpat (en supposant que la librairie est nommée libexpat.lib ou libexpat) pour que ça marche et avoir aussi libexpat (?.lib) dans ton répertoire
A+,
Marsh Posté le 19-02-2012 à 01:57:39
froz a écrit : J'ai bien compris, mais je dois laisser mon fichier sour la forme XXX.C et pas le transformer en executable pour l'utiliser. Sinon, ça serait trop simple |
Rien compris, la. Si tu as pas au final un exécutable, il y a peu de chances que tu accèdes aux fonctions de expat.
A+,
Marsh Posté le 19-02-2012 à 02:04:38
Justement, c'est bien ça le probleme. J'ai besoin que mon XML soit lu pendant la lecture du fichier.C et ce, sans avoir la possibilité de mettre un argument permettant d'identifier le chemin de la bibliotheque.
En gros, il faut que, si je tape
gcc -o test test.c
le XML soit lu, les données sont récupérées puis traitées
Marsh Posté le 19-02-2012 à 02:16:27
Citation : En gros, il faut que, si je tape |
Ca c'est rigoureusement impossible. Un compilateur compile, mais il n'en fait pas plus, et il n'exécutera pas le programme compilé.
Tu confonds manifestement les langages interprétés et les langages compilés.
D'ailleurs puisque tu connais java, avec java non plus tu pourrais pas faire ça:
javac test.java ça va pas exécuter le programme, juste le compiler en langage intermédiaire.
A+,
Marsh Posté le 18-02-2012 à 12:46:19
Bonjour à tous,
Je cherche un moyen simple et efficace de lire un fichier XML dans un fichier C et d'en récupérer les données pour les retraiter.
J'ai déja fait beaucoup de recherches sans résultat.
Je m'explique:
Je suis sous linux.
J'ai essayé à plusieurs reprises d'installer des librairies comme libxml, exapat ... etc
Lorsque je les utilise dans mon programme C, ça ne fonctionne pas.
J'ai ce type d'erreur avec libxml "error xmlChar* libxml/xmlstring.h" lorsque j'utilise le fichier parser.h avec la commande #include <libxml/parser.h> (je pense que parser.h fait appel à xmlstring.h).
Enfin bref, existe-t-il des librairies pré-intégrées qui permettent de lire un XML ?
Avez vous des exemples de codes ?
Je sais qu'en programmation java, il me suffisait juste de faire "import javax.xml.xpath.*" pour obtenir les librairies et apres je concevais mon code facilement avec Xpath, sous la forme suivante:
public static void main(String[] args) {
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(new File("/monfichier.xml" ));
XPath xpath=javax.xml.xpath.XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList)xpath.evaluate("//instance", doc,XPathConstants.NODESET);
for(int i=0;i<nl.getLength();i++)
{
System.out.println(((Element)nl.item(i)).getAttribute("name" ));
}
System.out.println("end "+doc.getFirstChild().getNodeName());
}
catch(Exception err)
{
System.out.println("erreur: "+err.getMessage());
}
}
En vous remerciant par avance pour votre aide qui me sera préciseuse
Froz
Message édité par froz le 18-02-2012 à 19:35:21