gilou Modérateur Modzilla | Bon, c'est pas du shell, mais si tu sais un peu coder le C:
- tu vas telecharger expat sur source forge (tu choisis le source unix ou pc selon tes besoins)
- tu lance l'auto configuration sous unix
- tu recompiles en faisant #undef sur les symboles XML_NS et XML_DTD (dans le fichier de config.h plateforme dependant, c'est lib/winconfig.h pour windows) ca fait un executable plus petit.
Si tout a ete ok jusque la (ca devrait), tu remplaces le fichier exemples/elements.c
Tu recompile l'executable correspondant, et tu obtient un exe qui fait ca et que tu peux adapter si besoin est (la je lui fait prendre un seul argument, le non du fichier a traiter, a toi de modifier ca selon ce qui t'arrange, et si la maniere dont les blancs sont geres ne te convient pas, tu peux modifier le code de characterData par exemple.
Code :
- /* This is simple demonstration of how to use expat. This program
- reads an XML document from standard input and writes a line with
- the name of each element to standard output indenting child
- elements by one tab stop more than their parent element.
- */
- #include <stdio.h>
- #include <string.h>
- #include "expat.h"
- static void XMLCALL
- characterData(void *userData, const char *s, int len)
- {
- if (len)
- {
- char *buf = malloc(len+1);
- strncpy(buf, s, len);
- buf[len] = 0;
- fputs(buf, stdout);
- free(buf);
- }
- }
- int
- main(int argc, char *argv[])
- {
- char buf[BUFSIZ];
- XML_Parser parser = XML_ParserCreate(NULL);
- int done;
- int depth = 0;
- FILE *fin = fopen(argv[1], "r" );
- if (!fin)
- {
- fprintf(stderr, "cannot open file %s\n", argv[1]);
- return 1;
- }
- XML_SetUserData(parser, &depth);
- XML_SetCharacterDataHandler(parser, characterData);
- do {
- size_t len = fread(buf, 1, sizeof(buf), fin);
- done = len < sizeof(buf);
- if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
- fprintf(stderr,
- "%s at line %d\n",
- XML_ErrorString(XML_GetErrorCode(parser)),
- XML_GetCurrentLineNumber(parser));
- return 1;
- }
- } while (!done);
- XML_ParserFree(parser);
- fclose(fin);
- return 0;
- }
|
Tu peux ensuite ajouter un handler pour les debuts et fins de tag, pour mieux controller quand tu veux des sauts de ligne...
Un exemple de modification ou je vire tous les blancs, tabs, saut de ligne... et envoie des sauts de ligne pour chaque tag fermant:
Code :
- /* This is simple demonstration of how to use expat. This program
- reads an XML document from standard input and writes a line with
- the name of each element to standard output indenting child
- elements by one tab stop more than their parent element.
- */
- #include <stdio.h>
- #include <string.h>
- #include "expat.h"
- static void XMLCALL
- characterData(void *userData, const char *s, int len)
- {
- char *p, *q;
- if (len)
- {
- char *buf = malloc(len+1);
- strncpy(buf, s, len);
- buf[len] = 0;
- p = buf;
- while (*p && (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r'))
- p++;
- q = buf + len;
- while (q != p && (*q == ' ' || *q == '\t' || *q == '\n' || *q == '\r'))
- {
- *q = 0;
- q--;
- }
- fputs(p, stdout);
- free(buf);
- }
- }
- static void XMLCALL
- startElement(void *data, const char *el, const char **attr)
- {
- }
- static void XMLCALL
- endElement(void *data, const char *el)
- {
- fprintf(stdout, "\n" );
- }
- int
- main(int argc, char *argv[])
- {
- char buf[BUFSIZ];
- XML_Parser parser = XML_ParserCreate(NULL);
- int done;
- int depth = 0;
- FILE *fin = fopen(argv[1], "r" );
- if (!fin)
- {
- fprintf(stderr, "cannot open file %s\n", argv[1]);
- return 1;
- }
- XML_SetUserData(parser, &depth);
- XML_SetCharacterDataHandler(parser, characterData);
- XML_SetElementHandler(parser, startElement, endElement);
- do {
- size_t len = fread(buf, 1, sizeof(buf), fin);
- done = len < sizeof(buf);
- if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
- fprintf(stderr,
- "%s at line %d\n",
- XML_ErrorString(XML_GetErrorCode(parser)),
- XML_GetCurrentLineNumber(parser));
- return 1;
- }
- } while (!done);
- XML_ParserFree(parser);
- fclose(fin);
- return 0;
- }
|
A toi d'adapter selon tes besoins (decider d'envoyer ou pas un \n selon le nom du tag (pas pour des </b>, </i> par exemple) etc etc)
Tout ca devrait aussi pouvoir se coder assez facilement en perl, il y a un wrapper de expat en perl il me semble.
A+, Message édité par gilou le 20-01-2004 à 19:03:21 ---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --
|